2016-04-12 20 views
-1

In meiner Android App. Wenn jemand versucht, eine Datei herunterzuladen, sollte er nach einer Speicherberechtigung fragen. Falls er genehmigt wird, sollte er mit dem Herunterladen der Datei beginnen. Nächste Zeit, wenn die Berechtigung bereits erteilt wurde, starten Sie einfach einen neuen Download. hier ist der Teil meines Codes ...Herunterladen von Dateien und fragen nach Storge Erlaubnis in Android

 public void downloadFile(String url) { 
      Uri source = Uri.parse(url); 

      // Make a new request pointing to the download url 
      DownloadManager.Request request = new DownloadManager.Request(source); 
       request.allowScanningByMediaScanner(); 
       request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 

      String fileExtension = MimeTypeMap.getFileExtensionFromUrl(url); 
      String fileName = URLUtil.guessFileName(url, null, fileExtension); 

      // save the file in the "Downloads" folder of SDCARD 
      request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); 
      // get download service and enqueue file 
      DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
      manager.enqueue(request); 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 

      if (url.contains("?dl=1")) { 
       if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) 
         == PackageManager.PERMISSION_GRANTED) { 
        downloadFile(url); 
       } else { 
        ActivityCompat.requestPermissions(MainActivity.this, 
          new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
          REQUEST_WRITE_EXTERNAL_STORAGE); 

       } 
       return true; 

      } 

Das Problem mit diesem Code ist:

Wenn der Benutzer die Erlaubnis App abstürzt verweigern.

Wenn der Benutzer die Erlaubnis zum ersten Mal erteilt, startet der Download nicht sofort ... der Benutzer muss erneut auf den Download-Link klicken.

+2

** Es ist nicht perfekt ** ist keine Frage, die beantwortet werden kann. Erwähnen Sie das Fehler/nicht erforderliche Verhalten zusammen mit dem Logcat, wenn es da ist. –

+0

Hallo, ich habe die Frage aktualisiert. Vielen Dank. – baalal

+0

Überprüfen Sie dies für die Erlaubnis fragen: developer.android.com/training/permissions/requesting.html –

Antwort

0

Sie benötigen ActivityCompat.OnRequestPermissionsResultCallback die Callback-Funktion zu implementieren.

So erster Schritt ist Ihre Klasse Signatur, so etwas zu ändern, aber vorsichtig sein, um die Aktivität zu verlängern, dass Sie die Erlaubnis Ergebnisse in benötigen, MainActivity ist nur ein Beispiel:

public class MainActivity extends AppCompatActivity 
     implements ActivityCompat.OnRequestPermissionsResultCallback 

Zweiter Schritt ist, außer Kraft zu setzen die folgende Funktion:

public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      int[] grantResults) { 

    if(requestCode == REQUEST_WRITE_EXTERNAL_STORAGE) 
    { 
     if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
      //Do something if the permission is granted 
     } 
     else 
     { 
      //Do something if the permission denied 
     } 
    } 
} 
+0

Überprüfen Sie dies für die Erlaubnis fragen: http://developer.android.com/training/permissions/requesting.html –

+0

@RameshKumar was soll ich überprüfen? – Pooya

+0

Entschuldigung aus Versehen kommentierte auf Ihre Antwort, war eigentlich auf Frage zu kommentieren .. –

0

Ihre shouldOverrideUrlLoading Methode gibt immer true zurück. Ist das das gewünschte Verhalten?

Versuchen Sie, wie unten eine Berechtigungsanfrage Antwortcode hinzufügen:

@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], 
              int[] grantResults) { 
    switch (requestCode) { 
     case REQUEST_WRITE_EXTERNAL_STORAGE: { 
      if (grantResults.length > 0 
       && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // do your work 
      } else { 
       // permission denied 
      } 
      return; 
     } 
    } 
} 

Quelle: http://developer.android.com/training/permissions/requesting.html#perm-request

Verwandte Themen