Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. Android SDK
Code

Firebase para Android: Armazenamento de Arquivo

by
Difficulty:BeginnerLength:MediumLanguages:

Portuguese (Português) translation by Erick Patrick (you can also view the original English article)

Durante a Google I/O 2016, Firebase foi reparesentado à comunidade de desenvolvedores como uma grande ferramenta, provendo suporte de backend a páginas web a aplicações mobile. Esse tutorial introduzirá o armazenamento de arquivos e a funcionalidade de recuperação disponiveis para apps Android.

Para aprender mais sobre a base de dados de tempo real, análise, registros de erro e autenticação do Firebase, veja alguns dos outros tutoriais aqui na Envato Tuts+.

Configuração de Autenticação

Por brevidade, pualremos o processo de configuração básico do Firebase no app Android e no console do Firebase. Se é a primeira vez configurando um app do Firebase, sugerimos verificar o artigo de Ashraff Hathibelagal, Começando com Firebase para Android.

Antes de começarmos a usar o Armazenamento do Firebase, precisaremos ou estar autenticados ou alterar as regras de autenticação no Console do Firebase para permitir usuários não atenticados acessarem e enviarem arquivos. Para simplificar, faremos o segundo. Comecemos indo à seção Armazenamento do Firebase, selecionando Armazenamento na coluna esquerda.

Firebase storage section navigation

Agora, perceberemos que temos duas abas no topo da tela: Arquivos e Regras.

Rules tab in Firebase storage

Selecionemos a aba Regras e na linha allow read, write: if request.auth != null; mude != para == e aperte o botão PUBLICAR.

Authentication rules for Firebase storage access

Agora, qualquer usuário do app pode enviar ou baixar arquivos do Firebase. Embora não seja ideal no ambiente de produção, tornará o aprendizado do Armazenamento do Firebase muito mais fácil sem precisar lidar com autenticação.

Enviando Arquivos Manualmente

Embora possível enviar arquivos de um app seja ótimo, algumas vezes, simplesmente, queremos salvá-los em algum lugar acessível o qual podemos baixá-los no app. É aqui que enviar arquivos manualmente do Console do Firebase vem a calhar. Na aba Arquivos, veremos um botão azul chamado Enviar Arquivo.

Button for manually uploading files to Firebase storage

Clique-o e selecionemos os arquivos a enviar, e aparecerão no Armazenamento do Firebase.

An uploaded file

Selecionar um arquivo no console trará sua visão detalhada, permitindo inspecionar arquivos enviados anteriormente.

An uploaded file details

Baixando Arquivos do Android App

Agora que temos um arquivo salvo no Firebase, baixemo-no em nosso app. Usaremos um layout simples em nossa MainActivity, contendo uma ImageView com o id de uma imagem.

Para acessar o Armazenamento do Firebase, precisamos obter uma referência ao objeto FirebaseStorage e criar uma StorageReference para a URL do nosso projeto e para o arquivo a baixar. Encontramos a URL do projeto no top da seção Arquivos da parte Armazenamento do Console do Firebase.

Agora, podemos criar um objeto File e tentar baixar o arquivo invocando getFile em StorageReference com o novo objeto File como parâmetro. Como essa operação acontece assícronamente, podemos adicionar OnSuccessListener e OnFailureListener à invocação para lidar com o que acontecer.

Em onSuccess() de OnSuccessListener, podemos pegar o objeto FileDownloadTask.TaskSnapshot e obter o arquivo, que é onde colocaremos nossa imagem para nossa ImageView.

Image downloaded from Firebase storage displayed in app

Baixando Arquivos como Vetor de Bytes

Se só precisamos baixar o arquivo como byte[] e não precisamos do arquivo em si, que é o caso de quando carregamos uma imagem em um ImageView, podemos obter os bytes de forma parecida.

Obtendo a URL de um Arquivo

Pode ter situações onde não queremos os dados em si de um arquivo mas, sim, sua URL. Podemos obtê-la de forma similar aos exemplos anteriores, usando getDownloadUrl() de StorageReference, que nos dará uma Uri apontando para o local do arquivo.

O método acima imprimirá a URL, no Android Monitor, da imagem que enviamos manualmente.

Enviando de um App do Android

Agora que sabemos como baixar arquivos do Firebase, é hora de enviar. Como vimos, ao baixar do Armazenamento do Firebase, os processos de cada abordagem são similares. Enviar arquivos não é diferente, logo, veremos como mover arquivos do app para o Armazenamento do Firebase.

Enviando como um Vetor de Bytes

Assim como baixar, precisaremos de uma referência do objeto FirebaseStorage além de uma referência ao novo local do arquivo como StorageReference. Nesse exemplo, mostraremos ic_launcher.png em nosso ImageView e o enviaremos como um vetor de bytes.

Agora, precisaremos de um vetor de byte da imagem salva na memória via ImageView. Isso é feito obtendo-a como Bitmap, comprimindo-a em ByteArrayOutputStream e transformando isso em byte[].

Por fim, podemos criar um UploadTask ao invocar putBytes(byte[]) para enviar a imagem para o Firebase. O UploadTaks também tem OnSuccessListener e OnFailureListener associado a ele.

Ao verificar a página de armazenamento no Console do Firebase, devemos ver ic_launcher.png na lista de arquivos.

Details from a programmatically uploaded image

Enviando de um InputStream ou Arquivo

Agora que sabemos como enviar um vetor de byte, os outros dois tipos de envios devem ser bem intuitivos. Digamos que temos um arquivo texto chamado test.txt em nossa pasta de recursos. Podemos lê-lo como InputStream e enviá-lo usando putStream(InputStream) de StorageReference.

List of uploaded images including text file from InputStream

Enviar algo existente é fácil: com a referência de um arquivo, invoque putFile(Uri) com a URI apontando para um aruivo. No exemplo, criamos um arquivo temporário vazio no código.

Raw file upload shown in Firebase storage

Controlando Envios e Usando Callbacks

Embora os arquivos enviados tenham sido pequenos, teremos vezes que enviaremos arquivos maiores que levarão mais tempo. Firebase provê alguns métodos com UploadTaks que nos permitirão controlr o fluxo do enviar e observar o progresso e mudanças de estado. Os métodos são pause(), resume() e cancel(). pause() e resume() permitem-nos parar e continuar um UploadTask enquanto cancel() para-o completamente. Além do mais, podemos usar OnPauseListener e OnProgressListener para acompanhar o progresso do envio e os estados de pausa.

O código acima permitirar controlar o processo de envio de um arquivo relativamente grande (1MB, no caso) e ver seu estado alterando no registro do Android quando os botões de pausar e continuar são apertados.

Manipulando o Ciclo de Vida das Atividades do Android

Como todo desenvolvedor Android confirma, seu ciclo de vida de atividade pode causar problemas inesperados. Uma das fontes de problemas são observadores que duram mais que a Activity pai, que pode ser o caso de observadores de sucesso/falha de tarefas de armazenamento do Firebase.

Se uma Activity é destruida e recriada (como em rotação de tela) enquanto é executada, pode dar em NullPointerException quando a tarefa é completada. Para evitar isso, precisamos saçvar StorageReference como String em nosso estado de Bundle em onSaveInstanceState(Bundle), e obte-lo e adicionar observadores de sucesso a cada FileDownloadTask ou FileUploadTask associada a StorageReference.

Conclusão

Nesse tutorial, aprendemos bastante sobre o Firebae e suas opções disponíveis para armazenamento de arquivos. Agora, somos capazes de enviar e baixar arquivos, controlar transferências de arquivos, manipular mudanças no ciclo de vida de atividade do app quando uma transação ocorrer.

Embora tenhamos apenas iniciamos com o Firebase, entender essa ferramenta habilitara-nos-a a expandir as capacdades dos nossos apps e prover ótimas experiências para os usuários.

Nesse meio tempo, veja alguns dos nossos outros artigos sobre desenvolvimento para Android!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.