Acessando armazenamento externo na Android API 29

Sep 11 2020

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

4 blackapps Sep 11 2020 at 07:10

No Android 10 Environment.getExternalStorageDirectory()e Environment.getExternalStoragePublicDirectory()retornará caminhos de armazenamento, mas os caminhos não são legíveis ou graváveis.

  1. 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 chamar Environment.isExternalStorageLegacy()para verificar se a solicitação foi realizada.

  2. 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 de Advanced 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 de Settings.ACTION_APPLICATION_DETAILS_SETTINGSonde ele pode alterar as configurações. O engraçado é que Environment.isExternalStorageLegacy () também retorna true.

  3. 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 para Settings.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.