No puedo crear el directorio en Android 10. Funciona en dispositivos hasta Android Oreo.
Intenté dos formas de crear carpetas.
Utilizando File.mkdir()
:
File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pastebin");
if (!f.isFile()) {
if (!(f.isDirectory())) {
success = f.mkdir();
}
Aquí, la variable success
siempre es falsa, lo que significa que el directorio no se crea.
Utilizando 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();
}
}
lo que causa esta excepción:
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)
He implementado los permisos de tiempo de ejecución y
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
están todos listos.
getExternalFilesDir()
y ubicaciones similares proporcionadas porContext
. No puede crear subdirectorios directamente desde las raíces del almacenamiento externo o extraíble, utilizando las API del sistema de archivos.Para Android 10, puedes agregar
android:requestLegacyExternalStorage="true"
a su elemento en el manifiesto. Esto lo lleva al modelo de almacenamiento heredado, y su código de almacenamiento externo existente funcionará. Sin embargo, esta solución no funcionará en Android R y superior, por lo que esta es solo una solución a corto plazo.
fuente
Dado que Q beta 4 es posible optar por no participar de esa función:
api 28 de api (o inferior) mediante el atributo de manifiesto requestLegacyExternalStorage:
fuente
Esto funciona para mí y creo que es funcional en Android 10>
fuente
File
, por lo que tendrás que agregarandroid:requestLegacyExternalStorage="true"
cuando apuntes a Android 10>. En ese caso, es mejor que sigas usandogetExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
.When an app targets Build.VERSION_CODES.Q, the path returned from this method is no longer directly accessible
, así que si tieneandroid:requestLegacyExternalStorage="true"
en su manifiesto, aún puede usarlo.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
soy nuevo en esto, pero mi pregunta sería: ¿mi propuesta es incorrecta o por qué el voto negativo? No sé muy bien cómo funciona esto, ¿es mejor continuargetExternalStoragePublicDirectory
?Uri
la carpeta, la carpeta se crea automáticamente.