Î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+.
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.
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.
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
.
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); );
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
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.
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.
InputStream
sau fișierAcum 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));
Î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
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!"); );
Î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!