Acessando armazenamento externo na Android API 29
Estou tentando conseguir algumas ferramentas de limpeza. Mais e mais fabricantes têm proibido o root de dispositivos por algum "motivo de segurança", é proibido NÃO solicitar o desbloqueio.
Após a API 28, este código apresentará erro:
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
}, 1); // Request permission or not, Will got same result
File rootFolder = Environment.getExternalStorageDirectory(); // That is working fine
rootFolder.listFiles(); // That will return null
Claro, posso usar isto:
android:requestLegacyExternalStorage="true"
Mas eu acredito que será morto no futuro.
Então, alguma forma elegante de gerenciar SDCard?
Respostas
No Android 10 Environment.getExternalStorageDirectory()e Environment.getExternalStoragePublicDirectory()retornará caminhos de armazenamento, mas os caminhos não são legíveis ou graváveis.
Para o Android 10, você pode continuar a usar os caminhos fornecidos por Environment.getExternalStorageDirectory () e Environment.getExternalStoragePublicDirectory () se adicionar
android:requestLegacyExternalStorage="true"à tag do aplicativo no arquivo de manifesto. Em tempo de execução, seu aplicativo pode chamarEnvironment.isExternalStorageLegacy()para verificar se a solicitação foi realizada.Outra possibilidade (não conhecida) (apenas para Android 10) é adicionar
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />ao arquivo de manifesto. O usuário deve ir para as configurações avançadas do aplicativo e habilitar deAdvanced settings Install unknown apps | Allow from this source. O bom disso é que o usuário pode mudar os direitos de acesso. Você pode tornar mais fácil para o usuário se implementar uma intenção deSettings.ACTION_APPLICATION_DETAILS_SETTINGSonde ele pode alterar as configurações. O engraçado é que Environment.isExternalStorageLegacy () também retorna true.Compilar para Android 11 ambas as opções não funcionam em um dispositivo Android 11. (Mas eles continuam a funcionar para dispositivos Android 10). Os caminhos de Environment.getExternalStorageDirectory () e Environment.getExternalStoragePublicDirectory () são
usable again in read mode and very often in write mode too. E isso é ótimo, pois é possível simplesmente listar o conteúdo de diretórios como Download ou Imagens ou DCIM / Câmera novamente usando a classe Arquivo. Mas adicionar<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />ao arquivo de manifesto e implementar uma intenção paraSettings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSIONdará ao seu aplicativo acesso de leitura / gravação para todos os arquivos, mesmo em um cartão micro SD removível. (Finalmente, você pode remover o banimento do google por não poder ler / escrever seu próprio cartão micro SD em seu próprio dispositivo Android usando seu próprio aplicativo).Environment.isExternalStorageManager()pode ser usado para verificar se a permissão está ativada / desativada. Contanto que você não tente carregar seu aplicativo na Play Store, você está bem.