Ich kann kein Verzeichnis in Android 10 erstellen. Es funktioniert auf Geräten bis Android Oreo.
Ich habe zwei Möglichkeiten zum Erstellen von Ordnern ausprobiert.
Verwenden von File.mkdir()
:
File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pastebin");
if (!f.isFile()) {
if (!(f.isDirectory())) {
success = f.mkdir();
}
Hier ist die Variable success
immer falsch, was bedeutet, dass das Verzeichnis nicht erstellt wird.
Verwenden von Files.createDirectory()
:
File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pastebin");
if (!f.isFile()) {
if (!(f.isDirectory())) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
try {
Files.createDirectory(Paths.get(f.getAbsolutePath()));
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), R.string.unable_to_download, Toast.LENGTH_LONG).show();
}
} else {
f.mkdir();
}
}
was diese Ausnahme verursacht:
pzy64.pastebinpro W/System.err: java.nio.file.AccessDeniedException: /storage/emulated/0/Pastebin
pzy64.pastebinpro W/System.err: at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:391)
pzy64.pastebinpro W/System.err: at java.nio.file.Files.createDirectory(Files.java:674)
Ich habe die Laufzeitberechtigungen implementiert und
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
sind alle eingestellt.
getExternalFilesDir()
und ähnliche Speicherorte erstellen, die von bereitgestellt werdenContext
. Sie können Unterverzeichnisse nicht direkt aus den Wurzeln des externen oder Wechseldatenspeichers mithilfe von Dateisystem-APIs erstellen.Für Android 10 können Sie hinzufügen
android:requestLegacyExternalStorage="true"
zu Ihrem Element im Manifest. Dadurch werden Sie in das Legacy-Speichermodell aufgenommen, und Ihr vorhandener externer Speichercode funktioniert. Dieser Fix funktioniert jedoch nicht unter Android R und höher, daher handelt es sich nur um einen kurzfristigen Fix.
quelle
Seit Q Beta 4 ist es möglich, diese Funktion zu deaktivieren, indem Sie:
Targeting von API 28 (oder niedriger) mithilfe des Manifestattributs requestLegacyExternalStorage:
quelle
Das funktioniert bei mir und ich denke, es funktioniert unter Android 10>
quelle
File
, daher müssen Sie hinzufügen,android:requestLegacyExternalStorage="true"
wenn Sie auf Android 10> abzielen. In diesem Fall können Sie genauso gut weiter verwendengetExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
.When an app targets Build.VERSION_CODES.Q, the path returned from this method is no longer directly accessible
, können Sie esandroid:requestLegacyExternalStorage="true"
in Ihrem Manifest weiterhin verwenden.Apps can continue to access content stored on shared/external storage by migrating to alternatives such as Context#getExternalFilesDir(String), MediaStore, or Intent#ACTION_OPEN_DOCUMENT
bin ich neu in diesem Bereich, aber dann wäre meine Frage, ob mein Vorschlag falsch ist oder warum die negative Abstimmung? Ich weiß nicht genau, wie das funktioniert. Ist es besser, weiterzumachengetExternalStoragePublicDirectory
?Uri
den Ordner schreiben, wird dieser automatisch erstellt.