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_STORAGEEN 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 baseFolderviene. Tenga en cuenta que getExternalStorageDirectoryes 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 28entonces? 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