Não consigo criar o diretório no android 10. Ele está funcionando em dispositivos até o Android Oreo.
Eu tentei duas maneiras de criar pastas.
Usando File.mkdir()
:
File f = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pastebin");
if (!f.isFile()) {
if (!(f.isDirectory())) {
success = f.mkdir();
}
Aqui, a variável success
é sempre falsa, o que significa que o diretório não é criado.
Usando 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();
}
}
o que causa essa exceção:
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)
Eu implementei as permissões de tempo de execução e
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
estão todos prontos.
getExternalFilesDir()
e locais semelhantes fornecidos porContext
. Você não pode criar subdiretórios a partir das raízes do armazenamento externo ou removível diretamente, usando APIs do sistema de arquivos.Para o Android 10, você pode adicionar
android:requestLegacyExternalStorage="true"
ao seu elemento no manifesto. Isso leva você ao modelo de armazenamento herdado, e seu código de armazenamento externo existente funcionará. Essa correção não funcionará no Android R e superior, portanto, essa é apenas uma correção de curto prazo.
fonte
Desde o Q beta 4, é possível desativar esse recurso:
visando a API 28 (ou inferior) usando o atributo de manifesto requestLegacyExternalStorage:
fonte
Isso funciona para mim e acho que é funcional no Android 10>
fonte
File
, portanto, precisará adicionarandroid:requestLegacyExternalStorage="true"
ao segmentar o Android 10>. Nesse caso, você também pode continuar usandogetExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
.When an app targets Build.VERSION_CODES.Q, the path returned from this method is no longer directly accessible
, por isso, se você tiverandroid:requestLegacyExternalStorage="true"
no seu manifesto, ainda poderá usá-lo.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
eu sou novo nisso, mas minha pergunta seria: minha proposta está errada ou por que o voto negativo? Não sei muito bem como isso funciona, é melhor continuargetExternalStoragePublicDirectory
?Uri
na pasta, ela é criada automaticamente.