ich bekomme
Öffnen fehlgeschlagen:
EACCES (Permission denied)
an der Leitung OutputStream myOutput = new FileOutputStream(outFileName);
Ich habe die Wurzel überprüft und es versucht android.permission.WRITE_EXTERNAL_STORAGE
.
Wie kann ich dieses Problem beheben?
try {
InputStream myInput;
myInput = getAssets().open("XXX.db");
// Path to the just created empty db
String outFileName = "/data/data/XX/databases/"
+ "XXX.db";
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// Transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
buffer = null;
outFileName = null;
}
catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Antworten:
Ich hatte das gleiche Problem ... Das
<uses-permission
war am falschen Ort. Dies ist richtig:Das
uses-permission
Tag muss sich außerhalb desapplication
Tags befinden.quelle
<uses-permission>
Tag erscheint nach<application>
Tag"android:maxSdkVersion="18"
. Es erzeugte diese AusnahmeFür API 23+ müssen Sie die Lese- / Schreibberechtigungen anfordern, auch wenn sie bereits in Ihrem Manifest enthalten sind.
AndroidManifest.xml
Eine offizielle Dokumentation zum Anfordern von Berechtigungen für API 23+ finden Sie unter https://developer.android.com/training/permissions/requesting.html
quelle
Google hat eine neue Funktion für Android Q : Gefilterte Ansicht für externen Speicher. Eine schnelle Lösung hierfür ist das Hinzufügen dieses Codes zur Datei AndroidManifest.xml:
Weitere Informationen finden Sie hier: https://developer.android.com/training/data-storage/compatibility
quelle
android:requestLegacyExternalStorage="true"
dies nicht zu niedrigeren Versionen führen wird. @UrielFrankelIch habe dies einmal beobachtet, als ich die Anwendung im Emulator ausführte. In den Emulatoreinstellungen müssen Sie die Größe des externen Speichers ("SD-Karte") richtig angeben. Standardmäßig ist das Feld "Externer Speicher" leer. Dies bedeutet wahrscheinlich, dass kein solches Gerät vorhanden ist und EACCES auch dann ausgelöst wird, wenn im Manifest Berechtigungen erteilt wurden.
quelle
Stellen Sie zusätzlich zu allen Antworten sicher, dass Sie Ihr Telefon nicht als USB-Speicher verwenden.
Ich hatte das gleiche Problem bei aktiviertem HTC Sensation im USB-Speichermodus. Ich kann die App weiterhin debuggen / ausführen, aber nicht auf einem externen Speicher speichern.
quelle
In android: requestLegacyExternalStorage = "true" auf das Android - Manifest Es ist arbeitete mit Android 10 (Q) bei SDK 29+
oder nach der Migration Android X .
quelle
Mein Problem war mit "TargetApi (23)", das benötigt wird, wenn Ihre minSdkVersion unter 23 liegt.
Ich habe also eine Erlaubnis mit dem folgenden Snippet angefordert
quelle
Lösung für Android Q :
quelle
Ich erlebe das gleiche. Ich habe festgestellt, dass das Problem behoben wird, wenn Sie zu Einstellungen -> Anwendungsmanager -> Ihre App -> Berechtigungen -> Speicher aktivieren gehen .
quelle
Es stellte sich heraus, dass es ein dummer Fehler war, da ich mein Telefon immer noch mit dem Desktop-PC verbunden hatte und dies nicht bemerkte.
Also musste ich die USB-Verbindung ausschalten und alles funktionierte einwandfrei.
quelle
Ich hatte das gleiche Problem auf dem Samsung Galaxy Note 3 mit CM 12.1. Das Problem für mich war, dass ich hatte
und musste es verwenden, um Benutzerfotos aufzunehmen und zu speichern. Als ich versuchte, dieselben Fotos in ImageLoader zu laden, wurde der
(Permission denied)
Fehler angezeigt . Die Lösung bestand darin, explizit hinzuzufügenda die obige Berechtigung die Schreibberechtigung nur auf API-Version 18 und damit die Leseberechtigung beschränkt.
quelle
Zusätzlich zu allen Antworten hat Android, wenn die Clients Android 6.0 verwenden, ein neues Berechtigungsmodell für (Marshmallow) hinzugefügt .
Trick: Wenn Sie auf Version 22 oder niedriger abzielen, fordert Ihre Anwendung bei der Installation alle Berechtigungen an, genau wie auf jedem Gerät, auf dem ein Betriebssystem unter Marshmallow ausgeführt wird. Wenn Sie den Emulator ausprobieren, müssen Sie ab Android 6.0 explizit die Einstellungen-> Apps-> YOURAPP -> Berechtigungen aufrufen und die Berechtigung ändern, falls Sie welche erteilt haben.
quelle
Seltsamerweise wurde mein Problem gelöst, nachdem ich vor meiner neuen Datei einen Schrägstrich "/" gesetzt hatte . Ich habe das geändert:
dazu:
quelle
Ich hatte das gleiche Problem und keiner der Vorschläge half. Aber ich fand einen interessanten Grund dafür auf einem physischen Gerät, Galaxy Tab .
Wenn der USB-Speicher aktiviert ist, haben Lese- und Schreibberechtigungen für externen Speicher keine Auswirkungen. Schalten Sie einfach den USB-Speicher aus und mit den richtigen Berechtigungen ist das Problem behoben.
quelle
Ich würde erwarten, dass alles unten
/data
zum "internen Speicher" gehört. Sie sollten jedoch in der Lage sein, zu schreiben/sdcard
.quelle
Ändern Sie eine Berechtigungseigenschaft in Ihrer
/system/etc/permission/platform.xml
und der Gruppe wie unten angegeben.
quelle
Ich hatte den gleichen Fehler, als ich versuchte, ein Bild in den DCIM / Kamera-Ordner auf dem Galaxy S5 (Android 6.0.1) zu schreiben, und stellte fest, dass nur dieser Ordner eingeschränkt ist. Ich könnte einfach in DCIM / einen beliebigen Ordner schreiben, aber nicht in die Kamera. Dies sollte eine markenbasierte Einschränkung / Anpassung sein.
quelle
Wenn Ihre Anwendung zur Systemanwendung gehört, kann sie nicht auf die SD-Karte zugreifen.
quelle
Beachten Sie Folgendes, auch wenn Sie im Manifest alle korrekten Berechtigungen festgelegt haben: Der einzige Ort, an dem Apps von Drittanbietern auf Ihre externe Karte schreiben dürfen, sind "ihre eigenen Verzeichnisse" (dh / sdcard / Android / data /), in die geschrieben werden soll irgendwo anders: Sie erhalten eine Ausnahme: EACCES (Berechtigung verweigert)
quelle
Vielleicht lautet die Antwort:
Wenn Sie auf der API> = 23 Geräte die App installieren (die App ist keine System-App), sollten Sie die Speicherberechtigung unter "Einstellungen - Anwendungen" überprüfen. Es gibt eine Berechtigungsliste für jede App. Sie sollten sie aktivieren. Versuchen
quelle
In meinem Fall habe ich eine Dateiauswahlbibliothek verwendet, die den Pfad zum externen Speicher zurückgegeben hat, aber von dort aus gestartet wurde
/root/
. Und selbst mit der zur Laufzeit erteilten Berechtigung WRITE_EXTERNAL_STORAGE wurde immer noch der Fehler EACCES (Berechtigung verweigert) angezeigt .Verwenden Sie also
Environment.getExternalStorageDirectory()
, um den richtigen Pfad zum externen Speicher zu erhalten.Beispiel:
Kann nicht schreiben:
/root/storage/emulated/0/newfile.txt
Kann schreiben:
/storage/emulated/0/newfile.txt
Ausgabe 1:
Ausgabe 2:
quelle
root
Teils aus dem Pfad hat mein Problem behoben.Wenn Sie diese veraltete Methode ab Android 29 verwenden, wird der gleiche Fehler angezeigt:
java.io.FileNotFoundException: open failed: EACCES (Permission denied)
Auflösung hier:
getExternalStoragePublicDirectory ist in Android Q veraltet
quelle
Für alle, die aus Suchergebnissen hierher kommen und auf Android 10 abzielen: Android 10 (API 29) ändert einige Berechtigungen in Bezug auf Speicher.
Ich habe das Problem behoben, als ich meine vorherigen Instanzen von
Environment.getExternalStorageDirectory()
(die mit API 29 veraltet sind) durch ersetzt habecontext.getExternalFilesDir(null)
.Beachten Sie, dass
context.getExternalFilesDir(type)
null zurückgegeben werden kann, wenn der Speicherort nicht verfügbar ist. Überprüfen Sie dies daher immer dann, wenn Sie prüfen, ob Sie über externe Berechtigungen verfügen.Lesen Sie hier mehr .
quelle
Ich erstelle einen Ordner unter / data / in meiner init.rc (mit dem Aosp auf Nexus 7 herumspielen) und hatte genau dieses Problem.
Es stellte sich heraus, dass es nicht ausreichte, dem Ordner rw (666) die Berechtigung zu geben, und es musste rwx (777) sein, dann funktionierte alles!
quelle
Die Durchsetzung von Speicherberechtigungen nach Version 6.0 kann umgangen werden, wenn Sie über ein gerootetes Gerät über die folgenden adb-Befehle verfügen:
quelle
Berechtigung im Manifest hinzufügen.
quelle
android.permission.READ_INTERNAL_STORAGE
Ich hatte das gleiche Problem (API> = 23).
Die Lösung https://stackoverflow.com/a/13569364/1729501 funktionierte für mich, aber es war nicht praktisch, die App zum Debuggen zu trennen.
Meine Lösung bestand darin, den richtigen ADB-Gerätetreiber unter Windows zu installieren. Der Google USB-Treiber funktionierte für mein Gerät nicht.
SCHRITT 1: Laden Sie ADB-Treiber für Ihre Gerätemarke herunter.
SCHRITT 2: Gehen Sie zum Geräte-Manager -> Andere Geräte -> suchen Sie nach Einträgen mit dem Wort "adb" -> wählen Sie Treiber aktualisieren -> geben Sie in Schritt 1 den Speicherort an
quelle
Nach dem Hinzufügen der Erlaubnis löste sich mein Problem
quelle
Gradle-Abhängigkeiten hinzufügen
Fügen Sie den folgenden Code in Ihre Hauptaktivität ein.
quelle
In meinem Fall erschien der Fehler in der Zeile
Da ich keine neue Datei auf der SD-Karte erstellen konnte, musste ich den DocumentFile-Ansatz verwenden.
Für die obige Frage kann das Problem mit diesem Ansatz gelöst werden,
Siehe auch diesen Thread. Wie verwende ich die neue SD-Kartenzugriffs-API für Android 5.0 (Lollipop)?
quelle