Alura > Cursos de Mobile > Cursos de Android > Conteúdos de Android > Primeiras aulas do curso Jetpack Compose: lidando com armazenamento de arquivos no Android

Jetpack Compose: lidando com armazenamento de arquivos no Android

Arquitetura do armazenamento Android - Apresentação

Boas-vindas ao curso de Jetpack Compose: Lidando com Armazenamento de arquivos no Android! Sou o Júnior e serei o instrutor desse curso.

Junior é um homem de pele clara. Tem olhos castanhos e cabelos no comprimento no ombro na cor loiro-escuro. Usa óculos de grau com armação arredondada preta e está com uma camiseta também preta. Ao fundo, uma parede clara com iluminação degradê do rosa ao azul.

Nesse curso, aprenderemos como funciona o armazenamento de arquivos no Android.

Para isso, utilizaremos o Concord que simula um aplicativo de mensagens com várias funcionalidades.

Nele, poderemos acessar os chats de conversa e enviar diferentes tipos de mídia, como o sticker. Também conseguiremos consultar arquivos que o usuário pode ter armazenado no dispositivo móvel e enviá-los pelo aplicativo.

Para isso, usaremos a Media Store e o SAF - Storage Access Framework, as APIs mais famosas de armazenamento de arquivos do Android. Também aprenderemos como utilizar as permissões e como aplicar as melhores práticas de desenvolvimento para Android.

A partir do conhecimento adquirido nesse curso, a pessoa desenvolvedora poderá proporcionar uma experiência completa e personalizada ao usuário final. Sendo possível utilizar não só o que está disponível no aplicativo padrão como o que a pessoa usuária possui no próprio dispositivo.

Para esse curso, é recomendado que você saiba utilizar o Jetpack Compose, especialmente com States e View Model.

Para interagir com outros estudantes e tirar dúvidas, acesse nosso canal no Discord. Aproveite para compartilhar seu aprendizado nas redes sociais utilizando nossa hashtag #AprendinaAlura.

Te esperamos no próximo vídeo.

Até lá!

Arquitetura do armazenamento Android - Review do projeto

Acesse o código fonte do projeto inicial no GitHub

Nesse curso, utilizaremos Concord que simula um aplicativo de mensagens.

Concord

Print da tela inicial do Concord. No topo uma tarja verde, no canto esquerdo o nome do aplicativo "Concord". Abaixo, em um fundo branco, uma lista de conversas com 10 pessoas. Cada conversa é indicada pelo nome do contato, seguido por uma prévia da mensagem enviada ou recebida. No canto direito de cada mensagem há o horário da última mensagem

A tela principal possui conversas com vários contatos. Ao clicar nelas, encontramos uma lista com mensagens que contém mídias.

Nesse primeiro momento, ainda não temos a funcionalidade final do nosso aplicativo. Porém, na parte inferior da tela, já encontramos botões que ao serem clicados abrem novas abas. Ao longo do curso, adicionaremos novas funcionalidades a elas.

Review do projeto

com.alura.concord

Nosso projeto possui uma estrutura similar ao de cursos anteriores. Ao acessá-lo no Android Studio, na lateral esquerda, encontramos a pasta "com.alura.concord", clicamos nela e depois na pasta "data".

Feito isso, visualizamos os arquivos Chat.kt e Message.kt, modelos que usaremos no aplicativo. Essa pasta também armazena o SampleData.kt, um arquivo que contém uma lista de dados de exemplo que estão sendo utilizados pelo aplicativo nesse atual momento.

database

Na lateral esquerda, também encontramos o diretório "database", relacionado ao banco de dados do aplicativo. Ao acessá-lo, encontramos as Daos.

di.module

Na pasta "di.module" temos o DatabaseModule, que faz a injeção do banco de dados.

extensions

Já em "extensions" temos o arquivo de extensão com duas funções Context responsáveis para facilitar a visualização de uma mensagem ou log.

navigation

Acessando a pasta "navigation" encontramos três arquivos. O ChatListScreen.kt é a rota responsável por exibir a tela principal e de mensagens. Já o ConcordNavHost.kt contém cada uma das rotas individualmente, além disso a pasta também arquiva o MessageListScreen.kt.

ui

Em "ui" temos quatro pastas com os componentes do aplicativo. Na pasta "chat" encontramos o MessageListScreen.kt, o MessageUiState que possui cada tela desenhada e o MesageListViewMode.

Na pasta "components" encontramos componentes que servem para compor a tela com recursos reutilizáveis. Por exemplo, o AssyncImage.kt é um componente do Composable utilizado por meio da biblioteca Coil.

Nesse caso, já adicionamos algumas configurações padrão nesse componente e quando precisamos utilizá-lo, chamamos o AssyncImage() com configurações "pré-setadas".

O Coil serve tanto para carregarmos informações por meio de links da internet como de links dos arquivos dentro do armazenamento do Android.

Ainda em "components", encontramos os arquivos BottomSheetFiles.kt, BottomSheetStickers.kt e o MessageItems.kt que possui cada tela de envio de mensagem.

home

No diretório "home" temos as configurações da tela principal que também possui uma estrutura semelhante a de outros cursos de Jetpack Compose.

theme

Também encontramos na lateral esquerda a pasta "theme" que é gerada automaticamente pelo Andoid.

util

No diretório "util", temos o arquivo Date.kt. Ele possui duas funções que pegam a data e a hora atual e fazem uma formatação para deixar esteticamente mais bonito.

Também encontramos o arquivo ConcordApplication que serve para fazer a injeção de dependências e o MainActivity que chama o NavHost que configurará as rotas e configurações do projeto.

Emuladores

Nesse curso utilizaremos dois emuladores diferentes, um que está na versão do Android 13, que é a versão mais atual estável, além da versão Android 7.

Faremos isso, pois o armazenamento de arquivos no Android foi evoluindo com o tempo, então, existem alguns casos em que o mesmo código funciona de maneiras diferentes em algumas versões. Utilizando os dois emuladores faremos uma comparação de comportamento.

Como esse é um curso de armazenamento de arquivos, disponibilizamos uma pasta com arquivos como audios, documentos, imagens, figurinhas e vídeos. Quando formos utilizá-los, acessaremos essas pastas e os arrastaremos os arquivos para o projeto.

No próximo vídeo começaremos a explorar o mundo do armazenamento de arquivos dentro do Android.

Até lá!

Arquitetura do armazenamento Android - Tipos de armazenamento do Android

Quando lidamos com armazenamento de arquivos Android, o primeiro passo que devemos seguir é consultar a página da documentação oficial.

Documentação

Descendo a tela, encontramos uma seção referente aos dois principais tipos de armazenamento Android. O primeiro é o Armazenamento específico do app que é mais restrito aos dados do próprio aplicativo e o Armazenamento compartilhado que vários aplicativos podem consultar tanto para leitura quanto para escrita.

Também existem as opções Preferências e Banco de dados, que aprendemos em cursos anteriores e não estão relacionados ao armazenamento de arquivos.

Descendo a tela, encontramos uma tabela com informações referentes a quais separações temos dentro de cada armazenamento de arquivos.

Tipo de armazenamentoTipo de conteúdoMétodo de acessoPermissões necessáriasOutros apps podem acessar?Arquivos removidos na desinstalação do app?
Arquivos específicos do appArquivos destinados apenas ao uso do appDo armazenamento interno, getFilesDir() ou getCacheDir()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 recentesNãoSim
MídiaArquivos 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)\nAs permissões são necessárias para todos os arquivos no Android 9 (nível 28 da API) ou versões anterioresSim, embora o outro app precise da permissão READ_EXTERNAL_STORAGENão
Documentos e outros arquivosOutros tipos de conteúdo compartilhável, incluindo arquivos transferidos por downloadEstrutura de acesso ao armazenamentoNenhumSim, por meio do seletor de arquivos do sistemaNão
Preferências do appPares de chave-valorBiblioteca de Preferências do JetpackNenhumaNãoSim
DatabaseDados estruturadosBiblioteca de persistência RoomNenhumNãoSim

O armazenamento Arquivos específicos do app, por exemplo, consta que nunca precisa de permissões para o armazenamento interno. O mesmo acontece no armazenamento externo, porém somente quando o app é executado em dispositivos com o Android 4.4 ou versões anteriores.

Lembrando que nosso app dá suporte a partir do Android 5.0, que na data da gravação desse vídeo compõe cerca de 99% de todos os dispositivos Android em circulação.

Em Mídia, repare que outros apps podem acessá-lo, porém precisam de uma determinada permissão. Aprenderemos mais sobre isso em breve, nas próximas aulas.

Ao analisar essa tabela pela primeira vez, pode ser que surjam algumas dúvidas. Pensando nisso, preparamos um conteúdo mais informativo e didático.

Armazenamento de arquivos no Android

Faremos uma analogia. Imagine que o aplicativo Concord instalado no dispositivo do usuário é como se fosse você dentro da sua casa.

Se você quiser pegar uma garrafa de água na cozinha e levar para o cômodo em que está no momento, você pode.

Você também pode caminhar livremente pelos cômodos, pegar a garrafinha novamente e deixá-la no quarto ou na sala. Ou seja, você pode pegar ou deixar algo em qualquer lugar que quiser da casa.

Quando o app está instalado, ele tem acesso a algo referente a uma casa. É um escopo mais restrito no qual é possível navegar e escrever informações para poder consultar, tudo isso sem pedir acesso a ninguém.

Em volta da sua casa existem outras casas, certo? O mesmo acontece no armazenamento do Android que possui apps vizinhos. Da mesma forma que não podemos sair de casa e entrar na casa dos vizinhos sem permissão para pegar algo, no Android os aplicativos não podem acessar o diretório de outros aplicativos;

Essa é forma de funcionamento do Armazenamento interno. Ele está em um escopo maior, que se refere ao armazenamento específico.

Além disso, há áreas, como a calçada, que embora façam parte da casa, também podem ser acessadas por pessoas de fora. No aplicativo acontece o mesmo, ele possui um diretório que pertence exclusivamente ao aplicativo, porém, outros apps podem acessá-lo. Isso se refere ao Armazenamento Externo.

Esses dois tipos de armazenamentos, que estão relacionados ao escopo do nosso aplicativo, são considerados específicos.

É nesse tipo de armazenamento que geralmente temos:

Ele pode ser acessado pelos outros aplicativos, porém, com uma determinada condição que é a permissão.

Trazendo esse cenário para nossa analogia, seria como se você quisesse sair de casa para ir em um evento que precisa ingresso, ou seja, a permissão.

O Armazenamento compartilhado pode ser tanto da memória interna do dispositivo quanto de dispositivos conectados a ele, como um cartão de memória ou um pendrive.

Observações importantes:

O armazenamento específico interno é um bom lugar para guardar informações sensíveis ou temporárias. Isso porque só o aplicativo terá acesso e tudo será apagado após desinstalar o app.

Então, se quisermos guardar uma informação temporárea que não sejam acessadas por outras pessoas, é interessante guardá-las nesse tipo de armazenamento.

Em relação à segurança, tecnicamente esse diretório específico não pode ser acessado por outros apps. Porém, existe uma exceção, o Root, que possibilita o acesso ao superusuário. Sendo assim, a informação armazenada no armazenamento específico interno, pode ser exposta.

Embora esse não seja um procedimento simples, é importante considerar essa possibilidade no desenvolvimento de aplicativos.

Além disso, se quisermos manter um arquivo do dispositivo do usuário após o app ser removido, é preciso salvar a informação no Armazenamento Compartilhado. Que geralmente é a memória do próprio dispositivo ou cartão de memória, por exemplo.

No próximo vídeo colocaremos tudo o que aprendemos em prática utilizando o Android Studio.

Até lá!

Sobre o curso Jetpack Compose: lidando com armazenamento de arquivos no Android

O curso Jetpack Compose: lidando com armazenamento de arquivos no Android possui 132 minutos de vídeos, em um total de 57 atividades. Gostou? Conheça nossos outros cursos de Android em Mobile, ou leia nossos artigos de Mobile.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Android acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas