Firebase for Android File Storage

I løpet av 2016 I / O-konferansen i Google, ble Firebase gjeninnført til utviklerfellesskapet som et viktig verktøy for å gi rask back-end-støtte for nettsider og mobilapplikasjoner. Denne opplæringen vil introdusere deg til filoppbevaring og gjenfinningsfunksjonalitet som er tilgjengelig for Android-appene dine. 

Hvis du vil vite mer om Firebase's sanntidsdatabase, analyse, krasjrapportering og autentisering, sjekk ut noen av våre andre opplæringsprogrammer her på Envato Tuts+.

Autentiseringsoppsett

For korthetens skyld hopper vi over den generelle oppsettprosessen for Firebase i Android-appen og Firebase-konsollen. Hvis dette er første gang du prøver Firebase i en app, foreslår jeg først å sjekke ut Ashraff Hathibelagals artikkel Komme i gang med Firebase for Android. 

Før du kan begynne å bruke Firebase Storage, må du enten sørge for at brukeren er godkjent, eller endre reglene for autentiseringskrav i Firebase Console for å tillate uautoriserte brukere å få tilgang til og laste opp filer. For å holde ting enkelt, gjør vi sistnevnte. La oss begynne med å gå inn i lagringsdelen av Firebase ved å velge Oppbevaring i venstre navigasjonskolonne.

Deretter vil du legge merke til at det er to faner øverst på siden Oppbevaring skjerm: filer og regler

Velg regler fanen og på linjen tillat lese, skriv: hvis request.auth! = null;, endring != til == og klikk på PUBLISERE knapp.  

Nå må alle brukere av appen din kunne laste opp eller laste ned filer fra Firebase-backend. Selv om dette ikke er ideelt for et produksjonsmiljø, vil det gjøre det enklere å lære om Firebase Storage uten å måtte grave inn i autentiseringskoden.

Manuell opplasting av filer

Mens du er i stand til å laste opp filer fra en app, er det bra, noen ganger vil du bare lagre filer et sted som lett kan nås og trekkes ned i appen din. Dette er hvor man kan laste opp filer fra Firebase Console manuelt. Under filer fanen, vil du se en blå knapp med tittelen Last opp fil

Klikk det og velg filen du vil laste opp, og den vil vises i Firebase Storage.

Hvis du velger den filen i konsollen, får du en detaljvisning, slik at du kan inspisere filer som tidligere er lastet opp.

Nedlasting av filer fra en Android-app

Nå som du har en fil lagret i Firebase, la oss gå videre og trekke den ned i en app. Vi bruker et enkelt oppsett i vår Hoved aktivitet som inneholder en Imageview med en id av bildet.

   

For å få tilgang til Firebase Storage-filene dine må du først få en referanse til FirebaseStorage objekt, og opprett deretter en StorageReference til prosjektets URL og filen du vil laste ned. Du kan finne prosjektets URL på toppen av filer del av Oppbevaring i Firebase Console.

FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageRef = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("android.jpg");

Deretter kan du opprette en Fil objekt og forsøk å laste filen du vil ha ved å ringe getFile på din StorageReference med den nye Fil objekt bestått som en parameter. Siden denne operasjonen skjer asynkront, kan du legge til en OnSuccessListener og OnFailureListener til din samtale for å kunne håndtere enten beredskap. 

prøv final File localFile = File.createTempFile ("bilder", "jpg"); storageRef.getFile (localFile) .addOnSuccessListener (ny OnSuccessListener() @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Bitmap bitmap = BitmapFactory.decodeFile (localFile.getAbsolutePath ()); mImageView.setImageBitmap (bitmap); ). addOnFailureListener (ny OnFailureListener () @Override public void onFailure (@NonNull Unntak unntak) );  fangst (IOException e) 

I onSuccess () fra OnSuccessListener, du kan ta FileDownloadTask.TaskSnapshot objekt og hente filen, som er der vi skal sette bildet til vår Imageview.

Nedlasting av filer som en byte-array

Hvis du bare trenger å laste ned filen som en byte [] og trenger ikke det som en fil, noe som er mer sannsynlig når du legger et bilde inn i en Imageview, da kan du hente bytes på lignende måte.

siste lange ONE_MEGABYTE = 1024 * 1024; storageRef.getBytes (ONE_MEGABYTE) .addOnSuccessListener (ny OnSuccessListener() @Override offentlig tomgang onSuccess (byte [] bytes) Bitmap bitmap = BitmapFactory.decodeByteArray (bytes, 0, bytes.length); mImageView.setImageBitmap (bitmap); );

Få en fils URL

Det kan være situasjoner der du ikke trenger de faktiske dataene for en lagret fil, men vil helst ha URL-adressen. Du kan gjøre dette på samme måte som de to siste eksemplene ved å bruke getDownloadUrl () metode på din StorageReference, som vil gi deg en Uri peker til filens plassering.

storageRef.getDownloadUrl (). addOnSuccessListener (ny OnSuccessListener() @Override public void onSuccess (Uri uri) Log.e ("Tuts +", "uri:" + uri.toString ()); // Håndter hva du skal gjøre med nettadressen her);

Ovennevnte metode vil skrive ut nettadressen for bildet vi manuelt lastet opp tidligere i Android Monitor.

E / Tuts +: uri: https://firebasestorage.googleapis.com/v0/b/tutsplus-firebase.appspot.com/o/android.jpg?alt=media&token=1828111c-78e7-4640-b418-c65e7571576a

Laster opp fra en Android-app

Nå som du vet hvordan du laster ned filer fra Firebase, er det på tide å jobbe med opplastinger. Som du så når du laster ned fra Firebase Storage, er prosessene for hver form for data forholdsvis lik. Opplasting er ikke annerledes, så vi vil bare dykke inn på hvordan du kan flytte filer fra appen din til Firebase Storage.

Laster opp en byte-array

Som med nedlasting, må du få en referanse til FirebaseStorage objekt og opprett en referanse til den nye filens lagringsplass som en StorageReference. For dette eksempelet vil vi vise ic_launcher.png i vår Imageview, og så laster vi opp det som en rekke byte.

FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("ic_launcher.png");

Deretter må vi få et byte array fra bildet lagret i minnet via Imageview. Dette gjøres ved å hente det som en bitmap, komprimere det til a ByteArrayOutputStream, og snu det til a byte [].

mImageView.setDrawingCacheEnabled (true); mImageView.measure (View.MeasureSpec.makeMeasureSpec (0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec (0, View.MeasureSpec.UNSPECIFIED)); mImageView.layout (0, 0, mImageView.getMeasuredWidth (), mImageView.getMeasuredHeight ()); mImageView.buildDrawingCache (); Bitmap bitmap = Bitmap.createBitmap (mImageView.getDrawingCache ()); ByteArrayOutputStream outputStream = ny ByteArrayOutputStream (); bitmap.compress (Bitmap.CompressFormat.JPEG, 100, outputStream); byte [] data = outputStream.toByteArray ();

Til slutt kan du opprette en UploadTask ved å ringe putBytes (byte []) å laste opp bildet ditt til Firebase. Dette UploadTask kan også ha en OnSuccessListener og OnFailureListener forbundet med det.

UploadTask uploadTask = storageReference.putBytes (data); uploadTask.addOnFailureListener (ny OnFailureListener () @Overgå offentlig ugyldig onFailure (@NonNull Unntak unntak) ). addOnSuccessListener (ny OnSuccessListener() @Overgå offentlig tomgang påSuccess (Opplastingsoppgave.TaskSnapshot oppgaveSnapshot) );

Når du sjekker lagringssiden for brannmassekonsoll, bør du se ic_launcher.png i listen over filer.

Laster opp fra en Input eller fil

Nå som du vet hvordan du laster opp et byte-array, bør de to andre typer opplastinger være ganske intuitive. La oss si at vi har en tekstfil kalt test.txt i vår rå ressurser mappe. Vi kan lese dette inn i en Input og last opp det ved å bruke putStream (Input) Metode av StorageReference.

FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("test.txt"); InputStream stream = getResources (). OpenRawResource (R.raw.test); UploadTask uploadTask = storageReference.putStream (stream);

Opplasting av en eksisterende fil er like enkelt: bare få en referanse til filen og ring putFile (Uri) med en URI som peker på filen din. For dette eksempelet vil vi bare opprette en tom tempelfil i vår kode.

FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("test2.txt"); Filfil = null; prøv file = File.createTempFile ("test2", "txt");  fangst (IOException e)  UploadTask uploadTask = storageReference.putFile (Uri.fromFile (fil));

Kontrollerer opplastinger og bruker tilbakeringinger

Mens filene vi har lastet opp hittil, har vært små, kan det være ganger hvor du har større opplastinger som vil ta litt tid. Firebase gir noen metoder med UploadTask som vil tillate deg å kontrollere strømmen av en opplasting og lytte til fremdrift og tilstandsendringer. Disse metodene inkluderer pause(), gjenoppta(), og Avbryt(). pause() og gjenoppta() vil la deg pause og gjenoppta en UploadTask, mens Avbryt() vil helt stoppe det. I tillegg kan du bruke en OnPauseListener og OnProgressListener for å holde oversikt over opplastingsprosessen og pause statene.

mPause = (Button) findViewById (R.id.pause); mResume = (Button) findViewById (R.id.resume); mPause.setOnClickListener (ny View.OnClickListener () @Overtrid offentlig tomgang påClick (Vis visning) mUploadTask.pause ();); mResume.setOnClickListener (new View.OnClickListener () @Override public void onClick (View view) mUploadTask.resume ();); FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("image.jpg"); InputStream stream = getResources (). OpenRawResource (R.raw.image); mUploadTask = storageReference.putStream (stream); mUploadTask.addOnPausedListener (ny OnPausedListener() @Overtrid offentlig tomgang onPaused (UploadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "Upload pause!"); ); mUploadTask.addOnProgressListener (ny OnProgressListener() @Overtrid offentlig tomgang påProgress (UploadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "Bytes lastet opp:" + taskSnapshot.getBytesTransferred ()); );

Ovennevnte kode vil tillate deg å kontrollere opplastingsprosessen for et noe stort bilde (1MB, i dette tilfellet) og se dets tilstander skifte i Android-loggen når pause og gjenoppta knappene trykkes.

E / Tuts +: Bytes lastet opp: 524288 E / Tuts +: upload paused! E / Tuts +: Bytes lastet opp: 786432

Håndter Android Aktivitetslivsyklus

Som enhver Android-utvikler kan attestere, kan Android-livssyklusen noen ganger føre til uventede problemer. En av de vanligste problemkildene er lyttere som varer lenger enn foreldrene sine Aktivitet, som kan være tilfelle for suksess / fiasko lyttere knyttet til en brannbase lagringsoppgave. 

Hvis en Aktivitet blir ødelagt og gjenopprettet (for eksempel på skjermrotasjon) mens en oppgave skjer, kan du ende opp med en NullPointerException når oppgaven er fullført. For å unngå dette vil du lagre din StorageReference som en string i din ut tilstand Bunt i onSaveInstanceState (Bundle) metode, og hent deretter det og legg til suksesslyttere til hver FileDownloadTask eller FileUploadTask forbundet med det StorageReference.

@Override protected void onSaveInstanceState (Bundle outState) super.onSaveInstanceState (outState); hvis (mStorageReference! = null) outState.putString (EXTRA_STORAGE_REFERENCE_KEY, mStorageReference.toString ());  @Override protected void onRestoreInstanceState (Bundle savedInstanceState) super.onRestoreInstanceState (savedInstanceState); siste String stringRef = savedInstanceState.getString (EXTRA_STORAGE_REFERENCE_KEY); hvis (stringRef == null) return;  mStorageReference = FirebaseStorage.getInstance (). getReferenceFromUrl (stringRef); Liste oppgaver = mStorageReference.getActiveDownloadTasks (); for (FileDownloadTask oppgave: oppgaver) task.addOnSuccessListener (denne nye OnSuccessListener() @Overtrid offentlig tomgang påSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "last ned vellykket!"); ); 

Konklusjon

I denne opplæringen har du lært mye om Firebase og dets tilgjengelige alternativer for filoppbevaring. Du bør nå kunne laste opp og laste ned filer, kontrollere dataoverføringer og håndtere endringer i appens aktivitetslivssyklus mens en transaksjon skjer. 

Mens vi nettopp har kløftet overflaten av hva du kan gjøre i Firebase, vil forståelsen av dette verktøyet forhåpentligvis gjøre det mulig for deg å utvide egenskapene til dine egne apper og gi gode erfaringer for brukerne dine.

Og i mellomtiden, sjekk ut noen av våre andre artikler om Android-utvikling!

  • Kom i gang Bygg et materialdesignapp

    I denne videoen fra kurset mitt om å bygge en materiell design-app, lærer du hvordan du lager brukergrensesnittet til en materiell design-app. Du lærer å ...
    Ashraff Hathibelagal
    Android
  • Bakgrunnslyd på Android med MediaSessionCompat

    En av de mest populære bruksområder for mobile enheter er å spille av lyd gjennom musikkstrømstjenester, nedlastede podcaster eller et hvilket som helst antall lyd ...
    Paul Trebilcox-Ruiz
    Android SDK
  • Slik kommer du i gang med en Android App-mal

    CodeCanyon har hundrevis av Android-appmaler som du kan bruke til å hoppe på utviklingen av neste app. I denne veiledningen hjelper jeg deg med å komme i gang ...
    Ashraff Hathibelagal
    Android
  • Hva er nytt i Android Studio 2.2?

    De siste månedene har vært en spennende tid for Android Studio. Først kom versjon 2.1 med støtte for Android N. Da Google I / O brakte oss en forhåndsvisning av ...
    Jessica Thornsby
    Android