Não consigo acessar o armazenamento ao criar para o targetSdkVersion v29.
Aqui está a minha configuração gradle:
compileSdkVersion 29
buildToolsVersion "29.0.2"
...
minSdkVersion 15
targetSdkVersion 29
OBSERVAÇÃO: a WRITE_EXTERNAL_STORAGE
permissão é concedida e a mesma configuração funciona bem ao construir para targetSdkVersion 28
.
Aqui está a minha implementação:
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
}
e aqui está a exceção:
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 alguém tenha uma resposta, o que estou perdendo aqui?
Atualizar:
Aqui é de onde baseFolder
vem. Observe que esse getExternalStorageDirectory
é um método obsoleto.
val baseFolder: String = if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Environment.getExternalStorageDirectory().absolutePath
} else {
context.filesDir.absolutePath
}
obrigado
targetSdkVersion 28
. Este não é um problema de permissão!targetSdkVersion 28
então? De acordo com o erro, sim, é um problema relacionado à permissão, mas não porque as permissões não são concedidas.Respostas:
A partir do Android 11, a permissão de armazenamento está sendo revogada e os desenvolvedores precisam considerar maneiras alternativas de acessar o armazenamento de que precisam através do SAF ou do Media Store . Por enquanto, você pode continuar usando o que está usando adicionando o seguinte no manifesto nas tags do aplicativo:
Você pode considerar alterar seu minSDK para 19 e usá
getExternalFilesDir()
-lo para obter um caminho que não requer nenhuma permissão.fonte
ENOENT (No such file or directory)
, no entanto, o diretório definitivamente existe.getExternalFilesDir()
soa sobre a decisão certa de corrigir o problema.getExternalFilesDir()
por enquanto.Quando seu aplicativo é direcionado para Build.VERSION_CODES.Q, o caminho retornado desse método não fica mais diretamente acessível aos aplicativos.
Para mais detalhes, visite o Documentos
fonte
você precisa solicitar permissão Manifest.permission.WRITE_EXTERNAL_STORAGE novamente.
antes da 9.0, você solicita apenas Manifest.permission.READ_EXTERNAL_STORAGE e também recebe Manifest.permission.WRITE_EXTERNAL_STORAGE, mas, a partir da 9.0, você pode obter apenas uma permissão que você requereu.
Perdoe meu inglês pobre.
fonte