In Lollipop funktioniert die Download-Funktion in meiner App einwandfrei. Wenn ich jedoch auf Marshmallow aktualisiert habe, stürzt meine App ab und gibt diesen Fehler aus, wenn ich versuche, aus dem Internet auf die SD-Karte herunterzuladen:
Neither user nor current process has android.permission.WRITE_EXTERNAL_STORAGE
Es beschwert sich über diese Codezeile:
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
Ich habe die Berechtigungen im Manifest außerhalb der Anwendung:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
Ich habe das Projekt bereinigt und neu erstellt, aber es stürzt immer noch ab.
Antworten:
Sie sollten überprüfen, ob der Benutzer die Berechtigung zum externen Speichern erteilt hat, indem Sie Folgendes verwenden:
Wenn nicht, müssen Sie den Benutzer bitten, Ihrer App eine Berechtigung zu erteilen:
Natürlich sind diese nur für Marshmallow-Geräte, daher müssen Sie überprüfen, ob Ihre App auf Marshmallow ausgeführt wird:
Stellen Sie außerdem sicher, dass Ihre Aktivität implementiert wird
OnRequestPermissionResult
Die gesamte Erlaubnis sieht folgendermaßen aus:
Rückruf des Berechtigungsergebnisses:
quelle
Manifest.permission.WRITE_EXTERNAL_STORAGE
immer '-1' zurückzugeben, dh die Berechtigung wird verweigert. Überprüfen Sie die neue Dokumentation. Dort heißt es, dass Sie ab API 19 keineWRITE_EXTERNAL_STORAGE
Berechtigung benötigen . Wie einige der oben genannten Kommentare erwähnt, sollten Sie all dies mit demManifest.permission.READ_EXTERNAL_STORAGE
getExternalFilesDir()
. In anderen Fällenandroid.permission.WRITE_EXTERNAL_STORAGE
muss die Erlaubnis noch am besten erklärt werden.Mit freundlicher Genehmigung können Sie zur Laufzeit Berechtigungen anfordern .
Beispiel
Deklarieren Sie dies als global
Fügen Sie dies in Ihren
onCreate()
Abschnitt einNach setContentView (R.layout.your_xml);
Fügen Sie nun checkPermission () und requestPermission () hinzu.
Zu Ihrer Information
onRequestPermissionsResult
quelle
Überprüfen Sie die Mehrfachberechtigung in API-Ebene 23 Schritt 1:
Schritt 2:
Schritt 3:
Schritt 4: in onCreate of Activity checkPermissions ();
quelle
never ask again
und ohne ein paar Berechtigungen um? Bekommt der Benutzer Feedback? Es wäre schön gewesen, ein echtes Beispiel dafür oder mehr Kommentare zu Ihren Codefragmenten zu sehen.Sofern nicht unbedingt geschrieben werden muss, können Sie Dateien jederzeit im App-Verzeichnis speichern. In meinem Fall musste ich Dateien speichern und nach 2 bis 3 Tagen fand ich heraus, ob ich den Speicherpfad von ändere
zu
es funktioniert wie Charme auf allen Geräten. Dies liegt daran, dass Sie zum Schreiben in externen Speicher zusätzliche Berechtigungen benötigen, das Schreiben in ein internes App-Verzeichnis jedoch einfach ist.
quelle
Sie müssen die Laufzeitberechtigung in Marshmallow https://developer.android.com/training/permissions/requesting.html verwenden
Sie können App-Informationen einchecken -> Berechtigung
Ist Ihre App berechtigt, externen Speicher zu schreiben oder nicht?
quelle
Anscheinend hat der Benutzer die Berechtigung abgelehnt und die App versucht, auf eine externe Festplatte zu schreiben, was zu einem Fehler führt.
Überprüfen Sie https://developer.android.com/training/permissions/requesting.html
Dieses Video gibt Ihnen einen besseren Überblick über UX und behandelt die Laufzeitberechtigungen https://www.youtube.com/watch?v=iZqDdvhTZj0
quelle
Ab der Marshmallow-Version müssen Entwickler den Benutzer um Laufzeitberechtigungen bitten. Lassen Sie mich Ihnen den gesamten Prozess zum Abfragen von Laufzeitberechtigungen geben.
Ich benutze Referenz von hier: Marshmallow Laufzeitberechtigungen Android .
Erstellen Sie zunächst eine Methode, die prüft, ob alle Berechtigungen erteilt wurden oder nicht
Hier ist der Code, der nach der obigen Methode ausgeführt wird. Wir werden die
onRequestPermissionsResult()
Methode überschreiben :Wenn Benutzer klickt auf Verweigern Option dann
showDialogOK()
wird Verfahren verwendet wird Dialog zeigenWenn Benutzer klickt auf Verweigern und auch klickt eine Checkbox sagen „nie wieder fragen“ , dann
explain()
wird Verfahren verwendet wird Dialog zu zeigen.Methoden zum Anzeigen von Dialogen:
Das obige Code-Snippet fordert vier Berechtigungen gleichzeitig an. Sie können auch eine beliebige Anzahl von Berechtigungen für Ihre Aktivität gemäß Ihren Anforderungen anfordern.
quelle
Nach langem Suchen funktioniert dieser Code für mich:
Überprüfen Sie, ob die Berechtigung bereits vorhanden ist: Überprüfen Sie die Berechtigung WRITE_EXTERNAL_STORAGE. Zulässig oder nicht?
Implementieren Sie die Override onRequestPermissionsResult-Methode, um zu überprüfen, ob der Benutzer dies zulässt oder verweigert
quelle
es hat bei mir funktioniert
quelle
quelle
Bevor Sie mit dem Download beginnen, überprüfen Sie Ihre Laufzeitberechtigungen und, falls Sie keine Berechtigung haben, die Anforderungsberechtigungen wie diese Methode
requestStoragePermission ()
quelle
Auf einfache Weise kann die Berechtigung mithilfe der Datei manifest.xml erteilt werden, aber es war bis zur API Level 23 SDK Version 6 in Ordnung. Wenn wir von hier aus die Berechtigung erhalten möchten, müssen wir um die Verwendung bitten, um die Berechtigung zuzulassen welche benötigt werden.
Fügen Sie diesen Code einfach in die Datei mainActivity.java ein
Ersetzen Sie die KAMERA oder fügen Sie sie mit WRITE_EXTERNAL_STORAGE hinzu, wenn Sie möchten, und mit dem eindeutigen Code.
Dies ist der einfache Code, um die Berechtigung zu erhalten.
quelle