Gerenciar todos os arquivos em um dispositivo de armazenamento

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 exige amplo acesso a arquivos em um dispositivo, mas não podem fazer isso de forma eficiente usando as práticas recomendadas de armazenamento com foco em privacidade. Nessas situações, o Android oferece acesso especial aos apps, conhecido como acesso a todos os arquivos.

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 várias interações repetidas do usuário para selecionar diretórios usando o seletor de arquivos do sistema, ela vai 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, exigem considerações semelhantes.

Solicitar acesso a todos os arquivos

Para pedir 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 permitidas por 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 aplicativos 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, só será possível acessar um arquivo ou diretório se isso puder ser feito 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

Para entender 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 da Figura 1. Esse aviso informa 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 os desenvolvedores 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. O uso da permissão pelo app precisa estar dentro das finalidades permitidas e ser diretamente vinculado à função principal dele. Se o app incluir um caso de uso semelhante a qualquer um dos exemplos abaixo, é provável que ele possa solicitar a permissão MANAGE_EXTERNAL_STORAGE: