O Android usa um sistema de arquivos parecido com sistemas de arquivos em disco de outras plataformas. O sistema oferece várias opções para você salvar os dados do seu app:
- Armazenamento específico do app: armazene arquivos destinados apenas ao uso do seu app, seja em diretórios dedicados dentro de 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 confidenciais que outros apps não podem acessar.
- Armazenamento compartilhado: armazene arquivos que seu app pretende compartilhar com outros apps, incluindo mídia, documentos e outros arquivos.
- Preferências: armazene dados privados e primários em pares de chave-valor.
- Bancos de dados: armazene dados estruturados em um banco de dados particular usando a biblioteca de persistência Room.
As características dessas opções estão resumidas na tabela a seguir:
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 seu app | Do armazenamento interno, getFilesDir() ou getCacheDir() Do armazenamento externo, getExternalFilesDir() ou getExternalCacheDir() |
Nunca é necessário para armazenamento interno Não é necessário para armazenamento externo quando seu app é executado em dispositivos que usam o Android 4.4 (API level 19) ou versões posteriores |
Não, se os arquivos estiverem em um diretório dentro do armazenamento interno Sim, se os arquivos estiverem em um diretório dentro do armazenamento externo |
Sim |
Mídia | Arquivos de mídia compartilháveis (imagens, arquivos de áudio, vídeos) | API MediaStore . |
READ_EXTERNAL_STORAGE ou WRITE_EXTERNAL_STORAGE ao acessar arquivos de outros apps no Android 10 (API de nível 29) ou versão mais recente As permissões são necessárias para todos os arquivos no Android 9 (API de nível 28) 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 | Estrutura de acesso ao armazenamento | Nenhum | Sim, por meio do seletor de arquivos do sistema | Não |
Preferências do app | Pares de chave-valor | Biblioteca de Preferências do Jetpack | Nenhum | 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 se você precisar salvar uma grande quantidade de dados.
- Qual é o nível de confiabilidade do acesso aos dados?
- Se a funcionalidade básica do seu app exigir determinados dados, como quando o app for inicializado, coloque-os no diretório de armazenamento interno ou em um banco de dados. Os arquivos específicos do app no armazenamento externo nem sempre são acessíveis 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?
- Se você tiver dados significativos apenas para o app, use o armazenamento específico dele. Para conteúdo de mídia compartilhável, use o armazenamento compartilhado para que outros apps possam acessar o conteúdo. Para dados estruturados, use as preferências (para dados de chave-valor) ou um banco de dados (para dados que contenham mais de duas colunas).
- Os dados precisam ser particulares para seu app?
- Ao armazenar dados confidenciais, 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 tem o vantage adicional dos dados serem ocultados 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, tornando-se um lugar mais confiável para colocar dados indispensáveis para seu app.
Unidades 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ê poderá indicar uma preferência no arquivo de manifesto do app para instalá-lo no armazenamento externo:
<manifest ... android:installLocation="preferExternal"> ... </manifest>
Permissões e acesso ao armazenamento externo
O Android define as seguintes permissões para o acesso de leitura e gravação ao armazenamento externo: READ_EXTERNAL_STORAGE
e WRITE_EXTERNAL_STORAGE
.
Em versões anteriores do Android, os apps precisavam declarar essas permissões para acessar qualquer arquivo fora dos diretórios específicos do app no armazenamento externo. As versões mais recentes do Android dependem mais da finalidade de um arquivo que da localização dele para determinar a capacidade de um app acessá-lo. Esse modelo de armazenamento baseado em objetivos melhora a privacidade do usuário porque os apps recebem acesso apenas às áreas do sistema de arquivos do dispositivo que realmente usam.
Armazenamento com escopo
Para dar mais controle aos usuários sobre os próprios arquivos e para limitar a sobrecarga, os apps que segmentam o Android 10 (API de nível 29) ou 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, bem como apenas a tipos específicos de mídia que o app criou.
Use o armazenamento com escopo, a menos que seu 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, 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, seu app manterá o acesso a esses arquivos quando o armazenamento com escopo estiver ativado.
Se seu app tiver outro caso de uso que não seja coberto pelo armazenamento com escopo, registre uma solicitação de recurso e use o recurso de compatibilidade de apps fornecido pela plataforma.
Práticas recomendadas para gerenciar arquivos
Esta seção apresenta algumas práticas recomendadas gerais para abrir e compartilhar arquivos do seu app.
Não abrir e fechar arquivos repetidamente
Para ajudar a manter o bom desempenho do app, não abra e feche o mesmo arquivo várias vezes. É mais pesado para o sistema abrir e ler um arquivo pela primeira vez.
Compartilhar arquivos individuais
Se você quiser compartilhar arquivos individuais ou dados de apps com outros apps, o Android traz as seguintes APIs:
- Se quiser compartilhar arquivos específicos com outros apps, use a API
FileProvider
. - Se quiser expor dados a outros apps, você pode usar um provedor de conteúdo. Os provedores de conteúdo oferecem controle total sobre o acesso de leitura/gravação disponível para outros apps. Embora você possa usar provedores de conteúdo com qualquer forma de armazenamento, eles são mais usados com bancos de dados.
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.