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+.
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.
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.
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
.
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); );
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
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.
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.
Input
eller filNå 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));
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
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); Listeoppgaver = 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!"); );
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!