Gerenciar todos os arquivos em um dispositivo de armazenamento

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

A maioria dos apps que exigem acesso ao armazenamento compartilhado pode seguir as práticas recomendadas para compartilhar arquivos de mídia e compartilhar arquivos que não sejam de mídia. No entanto, alguns apps têm um caso de uso principal que requer amplo acesso a arquivos em um dispositivo, mas não podem fazer isso de forma eficiente usando as práticas recomendadas de armazenamento adequado para privacidade. Nessas situações, o Android oferece acesso especial, conhecido como Acesso a todos os arquivos, aos apps.

Por exemplo, o caso de uso principal de um app antivírus pode exigir a verificação frequente de muitos arquivos em diretórios diferentes. Se essa verificação exigir interações repetidas do usuário para selecionar diretórios usando o seletor de arquivos do sistema, ela poderá proporcionar uma experiência ruim ao usuário. Outros casos de uso, como apps gerenciadores de arquivos, de backup e restauração e de gerenciamento de documentos, podem exigir considerações semelhantes.

Solicitar acesso a todos os arquivos

Para solicitar acesso a todos os arquivos do usuário, o app pode:

  1. declarar a permissão MANAGE_EXTERNAL_STORAGE no manifesto;
  2. usar a ação da intent ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION para direcionar os usuários a uma página de configurações do sistema em que é possível ativar a opção: Permitir acesso para gerenciar todos os arquivos no app.

Para determinar se o app recebeu a permissão MANAGE_EXTERNAL_STORAGE, chame Environment.isExternalStorageManager().

Operações com a permissão MANAGE_EXTERNAL_STORAGE

A permissão MANAGE_EXTERNAL_STORAGE concede:

  • Acesso de leitura e gravação a todos os arquivos no armazenamento compartilhado.

  • Acesso ao conteúdo da tabela MediaStore.Files.

  • Acesso ao diretório raiz da unidade USB OTG e do cartão SD.

  • Acesso de gravação a todos os diretórios de armazenamento interno⁠, exceto /Android/data/, /sdcard/Android e a maioria dos subdiretórios de /sdcard/Android. Esse acesso de gravação inclui acesso ao caminho direto para o arquivo.

    Os apps que recebem essa permissão ainda não podem acessar os diretórios específicos do app que pertencem a outros apps porque eles aparecem como subdiretórios de Android/data/ em um volume de armazenamento.

Quando um app tem a permissão MANAGE_EXTERNAL_STORAGE, ele pode acessar esses outros arquivos e diretórios usando a API MediaStore ou os caminhos diretos para os arquivos. No entanto, ao usar o framework de acesso ao armazenamento, você só vai poder acessar um arquivo ou diretório se puder fazer isso sem a permissão MANAGE_EXTERNAL_STORAGE.

Invocar a atividade de gerenciamento de armazenamento de outro app

No Android 12 (nível 31 da API) e em versões mais recentes, os apps que têm as permissões MANAGE_EXTERNAL_STORAGE e QUERY_ALL_PACKAGES, como apps gerenciadores de arquivos, podem usar getManageSpaceActivityIntent() para direcionar os usuários até a atividade de gerenciamento de espaço personalizado de outro app.

O método getManageSpaceActivityIntent() recebe um nome de pacote e um código de solicitação, e retorna uma destas opções:

  • Uma PendingIntent, se o app com o nome do pacote especificado tiver definido uma atividade de "gerenciar espaço" personalizada. O app que chamou o método getManageSpaceActivityIntent() pode invocar a intent retornada para direcionar os usuários à atividade personalizada.
  • null, se o app com o nome de pacote especificado não definir uma atividade "gerenciar espaço".

Ativar MANAGE_EXTERNAL_STORAGE para testes

A fim de entender a forma como a permissão MANAGE_EXTERNAL_STORAGE afeta o app, ative-a em testes. Para fazer isso, execute o comando abaixo na máquina conectada ao dispositivo de teste:

adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow

Aviso do Google Play

Esta seção fornece um aviso aos desenvolvedores que publicam apps no Google Play.

Com o objetivo de limitar o amplo acesso ao armazenamento compartilhado, a política da Google Play Store foi atualizada para avaliar os apps destinados ao Android 11 (nível 30 da API) ou versões mais recentes que solicitam acesso a todos os arquivos com a permissão MANAGE_EXTERNAL_STORAGE. Essa política está em vigor desde maio de 2021.

Quando o app é direcionado ao Android 11 ou a versões mais recentes e declara a permissão MANAGE_EXTERNAL_STORAGE, o Android Studio mostra o alerta de lint exibido na Figura 1. Esse aviso lembra que "a Google Play Store tem uma política que limita o uso da permissão".

Figura 1. Aviso de lint no Android Studio que informa sobre a política da Google Play Store relacionada à permissão MANAGE_EXTERNAL_STORAGE.

Solicite a permissão MANAGE_EXTERNAL_STORAGE somente quando o app não puder usar efetivamente as APIs que proporcionam mais privacidade, como o framework de acesso ao armazenamento ou a API Media Store. Além disso, a aplicação da permissão precisa estar dentro dos usos permitidos e ser diretamente vinculada à função principal do app. Se o app incluir um caso de uso semelhante aos exemplos a seguir, é provável que você possa solicitar a permissão MANAGE_EXTERNAL_STORAGE:

  • Gerenciadores de arquivos
  • Backup e restauração de apps
  • Apps de antivírus
  • Apps de gerenciamento de documentos
  • Pesquisa de arquivos no dispositivo
  • Criptografia de disco e arquivo
  • Migração de dados de dispositivo para dispositivo