No puedo acceder al almacenamiento cuando compilo para targetSdkVersion v29.
Aquí está mi configuración de gradle:
compileSdkVersion 29
buildToolsVersion "29.0.2"
...
minSdkVersion 15
targetSdkVersion 29
TEN WRITE_EXTERNAL_STORAGE
EN CUENTA que se otorga el permiso y la misma configuración funciona bien cuando se construye para targetSdkVersion 28
.
Aquí está mi implementación:
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
}
y aquí está la excepción:
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)
Espero que alguien tenga una respuesta, ¿qué me estoy perdiendo aquí?
Actualizar:
Aquí es de donde baseFolder
viene. Tenga en cuenta que getExternalStorageDirectory
es un método obsoleto.
val baseFolder: String = if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Environment.getExternalStorageDirectory().absolutePath
} else {
context.filesDir.absolutePath
}
Gracias
targetSdkVersion 28
. ¡Esto no es un problema de permiso!targetSdkVersion 28
entonces? Según el error, sí, es un problema relacionado con los permisos, pero no porque no se otorguen los permisos.Respuestas:
A partir de Android 11, el permiso de almacenamiento se revoca y los desarrolladores tendrían que considerar formas alternativas de acceder al almacenamiento que necesitan a través de SAF o Media Store . Por el momento, puede seguir usando lo que está usando agregando lo siguiente en su manifiesto dentro de las etiquetas de la aplicación:
Es posible que desee considerar cambiar su minSDK a 19 y usarlo
getExternalFilesDir()
para obtener una ruta que no requiera ningún permiso.fuente
ENOENT (No such file or directory)
, sin embargo, el directorio definitivamente existe.getExternalFilesDir()
suena sobre la decisión correcta para solucionar el problema.getExternalFilesDir()
por ahora.Cuando su aplicación se dirige a Build.VERSION_CODES.Q, la ruta devuelta por este método ya no es directamente accesible para las aplicaciones.
Para más detalles visite Docs
fuente
necesita solicitar permiso Manifest.permission.WRITE_EXTERNAL_STORAGE nuevamente.
antes de 9.0, solo solicita Manifest.permission.READ_EXTERNAL_STORAGE y también obtendrá Manifest.permission.WRITE_EXTERNAL_STORAGE, pero comience con 9.0, solo puede obtener un permiso que haya solicitado nuevamente.
Perdona mi pobre inglés.
fuente