Atualizações de armazenamento no Android 11

O Android 11 melhorou ainda mais a plataforma, oferecendo melhor proteção a dados de apps e de usuários no armazenamento externo. Como parte desse esforço, a plataforma apresenta outras melhorias para facilitar a transição para o armazenamento com escopo.

Esta versão de pré-lançamento apresenta várias melhorias que apresentamos na Conferência de Desenvolvedores Android, por exemplo, ativação do acesso ao caminho do arquivo bruto para mídia, operações de edição em lote para mídia e uma IU atualizada para o framework de acesso ao armazenamento.

Nas próximas versões da Visualização do desenvolvedor, procure melhorias adicionais no acesso a arquivos, bem como políticas atualizadas sobre gerenciamento de arquivos e galerias de fotos. Como sempre, encorajamos você a enviar feedback para ajudar a moldar a próxima versão do Android. Use o Issue Tracker para enviar seus comentários.

Queremos receber seu feedback. Responda a esta breve pesquisa para nos contar como você está usando o recurso (link em inglês). Especificamente, conte-nos sobre os casos de uso afetados por esse recurso.

Aplicação de armazenamento com escopo

Para oferecer aos desenvolvedores mais tempo para testes, os apps direcionados ao Android 10 (API de nível 29) ainda podem solicitar o atributo requestLegacyExternalStorage. Essa sinalização permite que os apps desativem temporariamente as mudanças associadas ao armazenamento com escopo, por exemplo, conceder acesso a diretórios e tipos diferentes de arquivos de mídia. Depois que você atualizar seu app para direcioná-lo ao Android 11, o sistema ignorará a sinalização requestLegacyExternalStorage.

Manter a compatibilidade com o Android 10

Se o app desativa o armazenamento com escopo quando for executado em dispositivos com o Android 10, recomendamos que você continue definindo requestLegacyExternalStorage para true no arquivo de manifesto do app. Dessa forma, o app pode continuar a se comportar como esperado em dispositivos com o Android 10.

Migrar dados para diretórios que são visíveis ao usar armazenamento com escopo

Se o app usa o modelo de armazenamento legado e era direcionado anteriormente ao Android 10 ou versões anteriores, ele pode estar armazenando dados em um diretório que não será acessível quando o modelo de armazenamento com escopo for ativado. Antes de direcioná-lo ao Android 11, migre os dados para um diretório compatível com o armazenamento com escopo. Na maioria dos casos, é possível migrar os dados para o diretório específico do app.

Caso tenha dados para migrar, é possível preservar o modelo de armazenamento legado quando um usuário faz upgrade para a nova versão do app direcionada ao Android 11. Dessa forma, o usuário mantém o acesso aos dados do app armazenados nos diretórios onde o app salvou os dados anteriormente. Para ativar o modelo de armazenamento legado para um upgrade, defina o atributo preserveLegacyExternalStorage como true no manifesto do app.

Observação: a maioria dos apps não precisa usar preserveLegacyExternalStorage. Essa sinalização é projetada apenas para a situação em que você migrou os dados do app para um local compatível com o armazenamento com escopo e quando você quer que os usuários mantenham o acesso aos dados ao atualizar o app. Usar essa sinalização dificulta o teste de como o armazenamento com escopo afeta os usuários porque, quando eles atualizam o app, ele continua a usar o modelo de armazenamento legado.

Se você usar preserveLegacyExternalStorage, o modelo de armazenamento legado permanecerá em vigor até que o usuário desinstale o app. Se o usuário instalar ou reinstalar o app em um dispositivo com o Android 11, o app não poderá não utilizar o modelo de armazenamento com escopo, independentemente do valor de preserveLegacyExternalStorage.

Testar armazenamento com escopo

Para ativar o armazenamento com escopo no app, independentemente da versão do SDK de destino do app e dos valores da sinalização do manifesto, ative as seguintes sinalizações de compatibilidade de apps:

Para desativar o armazenamento com escopo e usar o modelo de armazenamento legado, desmarque as duas sinalizações.

Gerenciar armazenamento

Se o app for um gerenciador de arquivos e for executado no Android 11, ele não poderá mais excluir os arquivos de outros apps armazenados em cache, mesmo se o app tiver a permissão de Acesso a todos os arquivos. Em vez disso, o app precisa fazer o seguinte:

  1. Verificar o espaço livre invocando a ação da intent ACTION_MANAGE_STORAGE.
  2. Se não houver espaço livre suficiente no dispositivo, solicite ao usuário que autorize a limpeza de todos os caches. Para fazer isso, invoque a ação da intent ACTION_CLEAR_APP_CACHE.

Acesso a arquivos de mídia

Para facilitar o acesso a mídia e manter a privacidade do usuário, o Android 11 introduz os recursos a seguir.

Realizar operações em lote

Para consistência entre os dispositivos e maior conveniência do usuário, o Android 11 adiciona vários métodos à API MediaStore. Esses métodos são particularmente úteis para apps que querem um fluxo otimizado para modificar arquivos de mídia específicos, como, por exemplo, editar uma foto local.

Os métodos adicionados são os seguintes:

createWriteRequest()
Solicita que o usuário conceda acesso de gravação ao seu app para o grupo especificado de arquivos de mídia.
createFavoriteRequest()
Solicita que o usuário marque os arquivos de mídia especificados como "favoritos" no dispositivo. Todo app com acesso de leitura verá que o usuário marcou o arquivo como "favorito".
createTrashRequest()
Solicita que o usuário coloque os arquivos de mídia especificados na lixeira do dispositivo. Os itens na lixeira são excluídos permanentemente após um período definido pelo sistema.
createDeleteRequest()
Solicita que o usuário exclua permanentemente os arquivos de mídia especificados imediatamente sem colocá-los na lixeira antes.

Depois de chamar um desses métodos, o sistema cria um objeto PendingIntent. Depois que o app invoca essa intent, os usuários veem uma caixa de diálogo que solicita o consentimento deles para que o app atualize ou exclua os arquivos de mídia especificados.

Acessar arquivos usando caminhos brutos

O Android 11 permite que apps com a permissão READ_EXTERNAL_STORAGE leiam arquivos de mídia de um dispositivo usando caminhos de arquivo diretos e bibliotecas nativas. Esse recurso permite que o app funcione mais facilmente com bibliotecas de mídia de terceiros.

Se você usar caminhos de arquivo diretos e bibliotecas nativas, recomendamos desativar o armazenamento com escopo definindo requestLegacyExternalStorage como true no arquivo de manifesto do app. Dessa forma, o app se comportará como o esperado em dispositivos com o Android 10.

Acesso aos diretórios privados de outros apps

No Android 11, os apps não podem mais acessar arquivos em qualquer diretório dedicado e específico do app de outros aplicativos no armazenamento externo.

Restrições de acesso a documentos

Para dar aos desenvolvedores tempo para testes, as seguintes mudanças relacionadas ao Framework de acesso ao armazenamento (SAF, na sigla em inglês) a seguir entram em vigor somente se o app for direcionado ao Android 11.

Acesso a diretórios

Não é mais possível usar a ação da intent ACTION_OPEN_DOCUMENT_TREE para solicitar acesso aos seguintes diretórios:

  • O diretório raiz do volume de armazenamento interno.
  • O diretório raiz de cada volume do cartão SD que o fabricante do dispositivo considera confiável, independentemente de o cartão ser emulado ou removível.
  • O diretório Download

Acesso a arquivos

Não é mais possível usar a ACTION_OPEN_DOCUMENT_TREE ou a ação da intent ACTION_OPEN_DOCUMENT para solicitar que o usuário selecione arquivos individuais dos seguintes diretórios:

  • O diretório Android/data/ e todos os subdiretórios
  • O diretório Android/obb/ e todos os subdiretórios.

Testar a mudança

Para testar essa mudança de comportamento, faça o seguinte:

  1. Invoque uma intent com a ação ACTION_OPEN_DOCUMENT. Verifique se os diretórios Android/data/ e Android/obb/ não aparecem.
  2. Realize uma das seguintes ações:
  3. Invoque uma intent com a ação ACTION_OPEN_DOCUMENT_TREE. Verifique se o diretório Download aparece e se o botão de ação associado com o diretório está esmaecido.

Permissões

O Android 11 introduz as seguintes mudanças relacionadas às permissões de armazenamento:

Criar para qualquer versão

A primeira caixa de diálogo apresenta um link chamado Permitir nas configurações.
Figura 1. Caixa de diálogo exibida quando um app usa o armazenamento com escopo e solicita a permissão READ_EXTERNAL_STORAGE.

As seguintes mudanças entrarão em vigor no Android 11, independentemente da versão do SDK de destino do seu app:

  • A permissão de ambiente de execução Armazenamento foi renomeada para Arquivos e mídia.
  • Se o app não tiver desativado o armazenamento com escopo e solicitar a permissão READ_EXTERNAL_STORAGE, os usuários verão uma caixa de diálogo diferente em comparação ao Android 10. A caixa de diálogo indica que o app está solicitando acesso a fotos e mídia, como mostrado na Figura 1.

    Os usuários podem ver quais apps têm a permissão READ_EXTERNAL_STORAGE nas configurações do sistema. Na página Configurações > Privacidade > Gerenciador de permissões > Arquivos e mídia cada app com a permissão estará listado em Permitido para todos os arquivos.

    Observação: se o app for direcionado ao Android 11, lembre-se que esse acesso a "todos os arquivos" é somente para leitura. Para ler e gravar em todos os arquivos no armazenamento compartilhado usando esse app, a permissão Acesso a todos os arquivos é necessária.

Criar para o Android 11

Se o app for direcionado ao Android 11, tanto a permissão WRITE_EXTERNAL_STORAGE quanto a permissão privilegiada WRITE_MEDIA_STORAGE não fornecerão mais acesso adicional.

Acesso a todos os arquivos

Alguns apps têm um caso de uso principal que requer amplo acesso a arquivos, como gerenciamento de arquivos ou operações de backup e restauração. Para conseguir a permissão de acesso a todos os arquivos, eles podem:

  1. declarar a permissão MANAGE_EXTERNAL_STORAGE;
  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 seguinte opção: Permitir acesso para gerenciar todos os arquivos para o app.

A permissão de Acesso para todos os arquivos concede o seguinte:

Os apps podem acessar esses arquivos usando a API MediaStore ou caminhos de arquivos brutos. Se o app usar o Framework de acesso ao armazenamento, você não poderá usá-lo para acessar os arquivos e diretórios adicionais que a permissão Acesso a todos os arquivos disponibiliza.

Com a permissão MANAGE_EXTERNAL_STORAGE, os apps podem acessar dados possivelmente confidenciais no armazenamento compartilhado. Nas próximas versões da Visualização do desenvolvedor, procure o Google Play para fornecer diretrizes para apps que precisam dessa permissão.

Para saber mais sobre essa permissão especial e outras mudanças nas APIs de armazenamento do Android no Android 11, consulte o artigo Modern User Storage on Android no Medium (link em inglês).