Visão geral do armazenamento de dados e arquivos

O Android usa um sistema parecido com sistemas de arquivos em disco de outras plataformas. O sistema oferece várias opções para salvar os dados do app:

  • Armazenamento específico do app: armazene arquivos que são usados apenas pelo app, seja em diretórios dedicados em um volume de armazenamento interno ou em outros diretórios dedicados no armazenamento externo. Use os diretórios no armazenamento interno para salvar informações sensíveis que não podem ser acessadas por outros apps.
  • Armazenamento compartilhado: armazene arquivos que o app pretende compartilhar com outros, incluindo mídias, documentos e outros arquivos.
  • Preferências: armazene dados particulares e primitivos em pares de chave-valor.
  • Bancos de dados: armazene dados estruturados em um banco de dados particular usando a biblioteca de persistência do Room.

As características dessas opções estão resumidas na tabela abaixo:

Tipo de conteúdo Método de acesso Permissões necessárias Outros apps podem acessar? Arquivos removidos na desinstalação do app?
Arquivos específicos do app Arquivos destinados apenas ao uso do app Do armazenamento interno, getFilesDir() ou getCacheDir()

Do armazenamento externo, getExternalFilesDir() ou getExternalCacheDir()
Nunca necessárias para armazenamento interno

Não são necessárias para armazenamento externo quando o app é executado em dispositivos com o Android 4.4 (nível 19 da API) ou versões mais recentes
Não Sim
Mídia Arquivos de mídia compartilháveis (imagens, arquivos de áudio, vídeos) API MediaStore. READ_EXTERNAL_STORAGE ao acessar os arquivos de outros apps no Android 11 (nível 30 da API) ou versões mais recentes

READ_EXTERNAL_STORAGE ou WRITE_EXTERNAL_STORAGE ao acessar arquivos de outros apps no Android 10 (nível 29 da API)

As permissões são necessárias para todos os arquivos no Android 9 (nível 28 da API) ou versões anteriores
Sim, embora o outro app precise da permissão READ_EXTERNAL_STORAGE Não
Documentos e outros arquivos Outros tipos de conteúdo compartilhável, incluindo arquivos transferidos por download Framework de acesso ao armazenamento Nenhum Sim, usando o seletor de arquivos do sistema Não
Preferências do app Pares de chave-valor Biblioteca de Preferências do Jetpack Nenhuma Não Sim
Database Dados estruturados Biblioteca de persistência Room Nenhum Não Sim

A solução escolhida depende das suas necessidades específicas:

Quanto espaço seus dados exigem?
O armazenamento interno tem espaço limitado para dados específicos do app. Use outros tipos de armazenamento caso precise salvar uma grande quantidade de dados.
Qual é o nível de confiabilidade do acesso aos dados?
Se a funcionalidade básica do app precisar de certos dados, como para inicializar o app, coloque esses dados no diretório de armazenamento interno ou em um banco de dados. Os arquivos específicos do app que ficam no armazenamento externo nem sempre podem ser acessados, porque alguns dispositivos permitem que os usuários removam um dispositivo físico que corresponda ao armazenamento externo.
Que tipo de dados você precisa armazenar?
Caso alguns dados sejam importantes apenas para o app, use o armazenamento específico do app. Para conteúdos de mídias compartilháveis, use o armazenamento compartilhado para que outros apps possam acessar os conteúdos. No caso de dados estruturados, use as preferências (para dados de chave-valor) ou um banco de dados (para dados contendo mais de duas colunas).
Os dados precisam ser particulares do app?
Para armazenar dados sensíveis, que não podem ser acessados por nenhum outro app, use o armazenamento interno, as preferências ou um banco de dados. O armazenamento interno ainda oferece a vantagem de ocultar os dados dos usuários.

Categorias de locais de armazenamento

O Android oferece dois tipos de locais de armazenamento físico: o armazenamento interno e o armazenamento externo. Na maioria dos dispositivos, o armazenamento interno é menor que o externo. No entanto, o armazenamento interno está sempre disponível em todos os dispositivos, o que faz com que ele seja um lugar mais confiável para colocar dados indispensáveis do app.

Volumes removíveis, como um cartão SD, aparecem no sistema de arquivos como parte do armazenamento externo. O Android representa esses dispositivos usando um caminho, como /sdcard.

Os próprios apps são armazenados no armazenamento interno por padrão. No entanto, se o tamanho do APK for muito grande, você pode indicar uma preferência no arquivo de manifesto do app para o instalar no armazenamento externo:

<manifest ...
  android:installLocation="preferExternal">
  ...
</manifest>

Permissões e acesso ao armazenamento externo

O Android define estas permissões relacionadas ao armazenamento: READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE e MANAGE_EXTERNAL_STORAGE.

Em versões anteriores do Android, os apps precisavam declarar a permissão READ_EXTERNAL_STORAGE para acessar qualquer arquivo fora dos diretórios específicos do app no armazenamento externo. Além disso, os apps precisavam declarar a permissão WRITE_EXTERNAL_STORAGE para fazer modificações em qualquer arquivo fora do diretório específico do app.

As versões mais recentes do Android dependem mais da finalidade do arquivo do que da localização para determinar se um app tem permissão de acessar e fazer modificações nele. Mais especificamente, se o app for direcionado ao Android 11 (nível 30 da API) ou versões mais recentes, a permissão WRITE_EXTERNAL_STORAGE não tem efeito no acesso do app ao armazenamento. Esse modelo de armazenamento baseado na finalidade melhora a privacidade do usuário, porque os apps recebem acesso apenas às áreas do sistema de arquivos do dispositivo que eles realmente usam.

O Android 11 introduz a permissão MANAGE_EXTERNAL_STORAGE, que fornece acesso de gravação para arquivos fora do diretório específico do app e do MediaStore. Para saber mais sobre essa permissão e por que a maioria dos apps não precisa a declarar a fim de atender aos casos de uso, consulte o guia sobre como gerenciar todos os arquivos em um dispositivo de armazenamento.

Armazenamento com escopo

Para dar mais controle aos usuários sobre os próprios arquivos e para limitar a sobrecarga, os apps direcionados ao Android 10 (nível 29 da API) ou versões mais recentes recebem acesso com escopo ao armazenamento externo, ou armazenamento com escopo, por padrão. Esses apps só podem ter acesso ao diretório específico do app no armazenamento externo e a tipos específicos de mídias criadas pelo app.

Use o armazenamento com escopo, a menos que o app precise acessar um arquivo armazenado fora de um diretório específico do app e fora de um diretório que as APIs MediaStore possam acessar. Se você armazenar arquivos específicos do app no armazenamento externo, vai ser mais fácil adotar o armazenamento com escopo colocando esses arquivos em um diretório específico do app no armazenamento externo. Dessa forma, o app mantém o acesso a esses arquivos quando o armazenamento com escopo estiver ativado.

A fim de preparar o app para o armazenamento com escopo, consulte o guia de casos de uso e práticas recomendadas de armazenamento. Caso o app tenha outro caso de uso que não é abrangido pelo armazenamento com escopo, registre uma solicitação de recurso. É possível desativar temporariamente o uso do armazenamento com escopo.

Ver arquivos em um dispositivo

Para ver os arquivos armazenados em um dispositivo, use o Device File Explorer do Android Studio.

Outros recursos

Para mais informações sobre armazenamento de dados, consulte os seguintes recursos.

Vídeos