Ich kann beim Erstellen für targetSdkVersion v29 nicht auf den Speicher zugreifen.
Hier ist meine Gradle-Konfiguration:
compileSdkVersion 29
buildToolsVersion "29.0.2"
...
minSdkVersion 15
targetSdkVersion 29
HINWEIS: Die WRITE_EXTERNAL_STORAGE
Berechtigung wird erteilt, und dasselbe Setup funktioniert beim Erstellen für targetSdkVersion 28
.
Hier ist meine Implementierung:
val outputFolder = File(baseFolder + File.separator + "Output Folder")
if (!outputFolder.exists()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
Files.createDirectory(outputFolder.toPath()) //This allways returns false with targetSdkVersion 29
} else {
if (!outputFolder.mkdirs()) {
Log.e("SaveRaw", "Unable to create folder for audio recording")
}
}
}
outputFile = File("$baseFolder/Output Folder/$filename")
try {
fileOutputStream = FileOutputStream(outputFile)
} catch (e: FileNotFoundException) {
e.printStackTrace() // allways throwing exception here, even if Output Folder exists
}
und hier ist die Ausnahme:
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Chirp Auto Tester/2019_10_17 10:44:43.raw: open failed: EACCES (Permission denied)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:496)
at java.io.FileOutputStream.<init>(FileOutputStream.java:235)
at java.io.FileOutputStream.<init>(FileOutputStream.java:186)
Hoffe jemand hat eine Antwort, was vermisse ich hier?
Aktualisieren:
Hier kommt woher baseFolder
. Beachten Sie, dass dies getExternalStorageDirectory
eine veraltete Methode ist.
val baseFolder: String = if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Environment.getExternalStorageDirectory().absolutePath
} else {
context.filesDir.absolutePath
}
Vielen Dank
targetSdkVersion 28
. Dies ist kein Berechtigungsproblem!targetSdkVersion 28
dann funktioniert ? Laut Fehler handelt es sich um ein Problem mit Berechtigungen, jedoch nicht, weil die Berechtigungen nicht erteilt wurden.Antworten:
Ab Android 11 wird die Speicherberechtigung widerrufen, und Entwickler müssten alternative Möglichkeiten für den Zugriff auf den benötigten Speicher über SAF oder Media Store in Betracht ziehen . Vorerst können Sie das, was Sie verwenden, weiter verwenden, indem Sie in Ihrem Manifest in den Anwendungs-Tags Folgendes hinzufügen:
Möglicherweise möchten Sie Ihr minSDK auf 19 ändern und
getExternalFilesDir()
einen Pfad abrufen, für den keine Berechtigungen erforderlich sind.quelle
ENOENT (No such file or directory)
jedoch das Verzeichnis definitiv.getExternalFilesDir()
klingt nach der richtigen Entscheidung, um das Problem zu beheben.getExternalFilesDir()
.Wenn Ihre App auf Build.VERSION_CODES.Q abzielt, ist der von dieser Methode zurückgegebene Pfad für Apps nicht mehr direkt zugänglich.
Weitere Informationen finden Sie unter Docs
quelle
Sie benötigen erneut die Anforderungsberechtigung Manifest.permission.WRITE_EXTERNAL_STORAGE.
Vor 9.0 fordern Sie nur Manifest.permission.READ_EXTERNAL_STORAGE an und Sie erhalten auch Manifest.permission.WRITE_EXTERNAL_STORAGE. Ab 9.0 können Sie jedoch nur eine Berechtigung erhalten, die Sie angefordert haben.
Vergib mir mein schlechtes Englisch.
quelle