Firebase pentru Android stocare de fișiere

În timpul conferinței I / O Google din 2016, Firebase a fost reintrodusă în comunitatea de dezvoltatori, ca instrument important de furnizare a suportului rapid pentru back-end pentru paginile web și pentru aplicațiile mobile. Acest tutorial vă va prezenta funcția de stocare și recuperare a fișierelor disponibile pentru aplicațiile Android. 

Pentru a afla mai multe despre baza de date Firebase în timp real, analize, rapoarte de accidente și autentificare, consultați câteva dintre celelalte tutoriale de aici despre Envato Tuts+.

Configurarea autentificării

Din motive de coerență, vom trece peste procesul general de configurare pentru Firebase în aplicația Android și în consolă Firebase. Dacă aceasta este prima dată când încercați Firebase într-o aplicație, vă sugerăm să verificați mai întâi articolul Ashraff Hathibelagal, care începe cu Firebase pentru Android. 

Înainte de a începe să utilizați spațiul de stocare Firebase, trebuie să vă asigurați că utilizatorul dvs. este autentificat sau să schimbați regulile cerințelor de autentificare din Consola Firebase pentru a permite utilizatorilor neautorizați să acceseze și să încarce fișiere. Pentru a păstra lucrurile simple, o vom face pe cea din urmă. Să începem prin trecerea în secțiunea Storage a Firebase selectând Depozitare în coloana de navigare din stânga.

Apoi, veți observa că există două file în partea de sus a Depozitare ecran: Fișiere și reguli

Selectează reguli și pe linie permite citirea, scrie: if request.auth! = null;, Schimbare != la == și faceți clic pe PUBLICA buton.  

Acum, orice utilizator al aplicației dvs. ar trebui să poată încărca sau descărca fișiere din back-end-ul Firebase. În timp ce acest lucru nu este ideal pentru un mediu de producție, va fi mult mai ușor de învățat despre stocarea Firebase fără a fi nevoie să sapi în codul de autentificare.

Încărcarea manuală a fișierelor

Fiind capabil să încărcați fișiere dintr-o aplicație este excelentă, uneori pur și simplu doriți să stocați fișiere undeva care pot fi ușor accesate și trase în jos în aplicația dvs. Aici puteți juca manual fișiere din Consola Firebase. Sub Fișiere , veți vedea un buton albastru intitulat Incarca fisier

Faceți clic pe acesta și selectați fișierul pe care doriți să îl încărcați și acesta va apărea în spațiul de stocare Firebase.

Selectarea acelui fișier din consola va afișa o vizualizare detaliată, permițându-vă să inspectați fișierele încărcate anterior.

Descărcarea fișierelor dintr-o aplicație Android

Acum că aveți un fișier stocat în Firebase, hai să mergem mai departe și să-l tragem în jos într-o aplicație. Vom folosi un aspect simplu în nostru Activitate principala care conține o ImageView cu un id de imagine.

   

Pentru a accesa fișierele de stocare Firebase, va trebui mai întâi să primiți o referință la FirebaseStorage obiect, și apoi creați un StorageReference la adresa URL a proiectului dvs. și la fișierul pe care doriți să îl descărcați. Puteți găsi adresa URL a proiectului în partea de sus a paginii Fișiere secțiune din Depozitare în Consola Firebase.

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

Apoi, puteți crea un Fişier obiect și încercați să încărcați fișierul pe care îl doriți apelând ia fisierul pe dumneavoastră StorageReference cu noul Fişier obiect trecut ca parametru. Deoarece această operație are loc în mod asincron, puteți adăuga un mesaj OnSuccessListener și OnFailureListener la apelul dvs. pentru a face față situațiilor de urgență. 

încercați final Fișier localFile = File.createTempFile ("imagini", "jpg"); storageRef.getFile (localFile) .addOnSuccessListener (noul OnSuccessListener() @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) bitmap Bitmap = BitmapFactory.decodeFile (localFile.getAbsolutePath ()); mImageView.setImageBitmap (bitmap); ). addOnFailureListener (noul OnFailureListener () @Override public void onFailure (excepție @ excepție excepțională) );  captură (IOException e) 

În onSuccess () din OnSuccessListener, puteți lua FileDownloadTask.TaskSnapshot obiect și de a prelua fișierul, care este locul în care vom seta imaginea la noi ImageView.

Descărcarea fișierelor ca o arhivă de octeți

Dacă trebuie doar să descărcați fișierul ca a byte [] și nu aveți nevoie de ea ca fișier, ceea ce este cel mai probabil caz când încărcați o imagine într-un ImageView, atunci puteți recupera octeții într-un mod similar.

finală lungă ONE_MEGABYTE = 1024 * 1024; storageRef.getBytes (ONE_MEGABYTE) .addOnSuccessListener (noul OnSuccessListener() @Override public void onSuccess (octeți [] octeți) Bitmap bitmap = BitmapFactory.decodeByteArray (octeți, 0, bytes.length); mImageView.setImageBitmap (bitmap); );

Obținerea adresei URL a unui fișier

Pot apărea situații în care nu aveți nevoie de datele reale pentru un fișier stocat, ci mai degrabă doriți adresa URL. Puteți face acest lucru într - un mod similar cu ultimele două exemple utilizând getDownloadUrl () metodă pe dvs. StorageReference, care vă va oferi uri indicând locația fișierului.

addOnSuccessListener (noul OnSuccessListener)() @Override public void onSuccess (Uri uri) Log.e ("Tuts +", "uri:" + uri.toString ()); // Manipulați orice veți avea de făcut cu adresa URL aici);

Metoda de mai sus va imprima URL-ul pentru imaginea pe care am încărcat-o manual mai devreme în Monitorul Android.

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

Încărcarea dintr-o aplicație Android

Acum că știți cum să descărcați fișiere din Firebase, este timpul să lucrați la încărcări. După cum ați văzut când descărcați din Firebase Storage, procesele pentru fiecare formă de date sunt destul de asemănătoare. Încărcarea nu este diferită, așa că vom descoperi cum vă puteți muta fișierele din aplicația dvs. în Firebase Storage.

Încărcarea unui Byte Array

Ca și în cazul descărcării, va trebui să obțineți o referință la FirebaseStorage obiect și creați o referință la locația de stocare a noului fișier ca a StorageReference. Pentru acest exemplu, vom arăta ic_launcher.png în a noastră ImageView, și apoi îl vom încărca ca o serie de octeți.

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

Apoi, va trebui să obținem o matrice de octeți din imaginea stocată în memorie prin intermediul ImageView. Acest lucru se face prin preluarea lui ca a Bitmap, comprimându-l în a ByteArrayOutputStream, și apoi transformându-l în 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 = nou ByteArrayOutputStream (); bitmap.compress (Bitmap.CompressFormat.JPEG, 100, outputStream); octet [] data = outputStream.toByteArray ();

În cele din urmă, puteți crea un UploadTask sunând putBytes (byte []) pentru a încărca imaginea dvs. în Firebase. Acest UploadTask poate avea și un OnSuccessListener și OnFailureListener asociate cu acesta.

UploadTask uploadTask = storageReference.putBytes (date); uploadTask.addOnFailureListener (noul OnFailureListener () @Override public void onFailure (excepție @NonNull excepție) ) addOnSuccessListener (new OnSuccessListener() @Override public void onSuccess (sarcina UploadTask.TaskSnapshotSnapshot) );

Când bifați pagina de stocare a Consolei Firebase, ar trebui să vedeți ic_launcher.png în lista de fișiere.

Încărcarea de la InputStream sau fișier

Acum că știți cum să încărcați o matrice de octeți, celelalte două tipuri de încărcări ar trebui să fie destul de intuitive. Să presupunem că avem un fișier text numit test.txt în dosarul nostru de resurse prime. Putem citi acest lucru într-un InputStream și apoi încărcați-l utilizând putStream (InputStream) Metodă de StorageReference.

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

Încărcarea unui fișier existent este la fel de ușoară: pur și simplu obțineți o referință la fișier și apelați putFile (Uri) cu un URI indicând fișierul dvs. Pentru acest exemplu, vom crea doar un fișier temp temp în codul nostru.

Stocare FirebaseStorage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("test2.txt"); Fișier fișier = null; încercați file = File.createTempFile ("test2", "txt");  captură (IOExcepție e)  UploadTask uploadTask = storageReference.putFile (Uri.fromFile (fișier));

Controlarea încărcărilor și utilizarea apelurilor

În timp ce fișierele pe care le-am încărcat până acum au fost mici, este posibil să existe momente în care aveți încărcări mai mari, ceea ce va dura un timp destul. Firebase oferă câteva metode cu UploadTask care vă va permite să controlați fluxul unei încărcări și să ascultați progresul și modificările de stare. Aceste metode includ pauză(), relua(), și Anulare(). pauză() și relua() vă va permite să întrerupeți și să reluați o acțiune UploadTask, întrucât Anulare() o va opri complet. În plus, puteți utiliza un OnPauseListener și OnProgressListener pentru a urmări progresul încărcării și starea de pauză.

mPause = (buton) findViewById (R.id.pause); mResume = (buton) findViewById (R.id.resume); mPause.setOnClickListener (noul View.OnClickListener () @Override public void onClick (Vizualizare vizualizare) mUploadTask.pause ();); mResume.setOnClickListener (noul View.OnClickListener () @Override public void onClick (Vizualizare vizualizare) mUploadTask.resume ();); Stocare FirebaseStorage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .copii ("image.jpg"); Fluxul InputStream = getResources () openRawResource (R.raw.image); mUploadTask = storageReference.putStream (flux); mUploadTask.addOnPausedListener (noul OnPausedListener() @Override public void onPaused (UploadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "încărcare întreruptă"); ); mUploadTask.addOnProgressListener (noul OnProgressListener() @Override public void peProgress (UploadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "Bytes încărcat:" + taskSnapshot.getBytesTransferred ()); );

Codul de mai sus vă va permite să controlați procesul de încărcare pentru o imagine destul de mare (1MB, în acest caz) și să vedeți schimbarea stărilor în jurnalul Android atunci când sunt apăsate butoanele de pauză și de reluare.

E / Tuts +: Bytes încărcat: 524288 E / Tuts +: upload paused! E / Tuts +: Bytes încărcate: 786432

Manipularea ciclului de viață al activității Android

Pe măsură ce orice dezvoltator Android poate atesta, uneori ciclul de viață al activității Android poate provoca probleme neașteptate. Una dintre sursele comune de probleme este ascultătorii care durează mai mult decât părintele lor Activitate, care poate fi cazul ascultătorilor de succes / eșec atașați unei sarcini de stocare Firebase. 

Daca un Activitate este distrusă și recreată (cum ar fi rotirea ecranului) în timp ce o sarcină apare, puteți ajunge la un NullPointerException când sarcina sa încheiat. Pentru a evita acest lucru, veți dori să vă salvați StorageReference ca Şir în starea voastră Pachet în onSaveInstanceState (Bundle) , apoi recuperați-l și adăugați fiecare ascultător de succes FileDownloadTask sau FileUploadTask asociate cu asta StorageReference.

@Override protejat void onSaveInstanceState (Bundle outState) super.onSaveInstanceState (outState); dacă (mStorageReference! = null) outState.putString (EXTRA_STORAGE_REFERENCE_KEY, mStorageReference.toString ());  @Override protejate void onRestoreInstanceState (Bundle savedInstanceState) super.onRestoreInstanceState (savedInstanceState); ultimul string StringRef = savedInstanceState.getString (EXTRA_STORAGE_REFERENCE_KEY); dacă (stringRef == null) retur;  mStorageReference = FirebaseStorage.getInstance (). getReferenceFromUrl (stringRef); Listă tasks = mStorageReference.getActiveDownloadTasks (); pentru (sarcina FileDownloadTask: tasks) task.addOnSuccessListener (acest nou OnSuccessListener() @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "descărcare de succes!"); ); 

Concluzie

În acest tutorial ați învățat multe despre Firebase și opțiunile disponibile pentru stocarea fișierelor. Acum ar trebui să puteți să încărcați și să descărcați fișiere, să controlați transferurile de date și să gestionați modificările ciclului de viață al aplicației în timpul unei tranzacții. 

În timp ce tocmai am zgâriat suprafața a ceea ce puteți face în Firebase, înțelegerea acestui instrument vă va permite să vă extindeți capabilitățile propriilor aplicații și să oferiți experiențe extraordinare utilizatorilor dvs..

Între timp, verificați unele dintre celelalte articole despre dezvoltarea Android!

  • Începeți să creați o aplicație de design material

    În acest videoclip de la cursul meu privind construirea unei aplicații de design material, veți învăța cum să creați interfața de utilizator a unei aplicații de design material. Veți învăța cum să ...
    Ashraff Hathibelagal
    Android
  • Audio de fundal în Android Cu MediaSessionCompat

    Una dintre cele mai populare utilizări pentru dispozitivele mobile este redarea audio prin servicii de streaming muzical, podcast-uri descărcate sau orice alt număr de audio ...
    Paul Trebilcox-Ruiz
    Android SDK
  • Cum să începeți cu un șablon de aplicație Android

    CodeCanyon are sute de șabloane de aplicații Android pe care le puteți utiliza pentru a începe să dezvoltați următoarea aplicație. În acest tutorial, vă ajut să începeți ...
    Ashraff Hathibelagal
    Android
  • Ce este nou în Android Studio 2.2?

    Ultimele câteva luni au fost un moment interesant pentru Android Studio. Primul a venit versiunea 2.1 cu suport pentru Android N. Atunci Google I / O ne-a adus o previzualizare a ...
    Jessica Thornsby
    Android
Cod