Tijdens de Google I / O-conferentie van 2016 werd Firebase opnieuw geïntroduceerd in de ontwikkelaarscommunity als een belangrijk hulpmiddel voor snelle back-endondersteuning voor webpagina's en mobiele applicaties. Deze tutorial zal u kennis laten maken met de bestandsopslag- en opvraagfunctionaliteit die beschikbaar is voor uw Android-apps.
Bekijk enkele van onze andere handleidingen hier op Envato Tuts voor meer informatie over Firebase's real-time database, analyse, crashrapportage en authenticatie.+.
Kortheidshalve slaan we het algemene installatieproces voor Firebase over in uw Android-app en de Firebase-console. Als dit je eerste keer is dat je Firebase in een app probeert, raad ik je aan eerst het artikel van Ashraff Hathibelagal te lezen Aan de slag met Firebase voor Android.
Voordat u Firebase-opslag kunt gaan gebruiken, moet u ervoor zorgen dat uw gebruiker is geverifieerd of de vereisten voor verificatievereisten wijzigen in de Firebase-console om niet-geverifieerde gebruikers toegang te verlenen tot en bestanden te uploaden. Om de dingen eenvoudig te houden, doen we het laatste. Laten we beginnen door naar het gedeelte Opslag van Firebase te gaan door te selecteren opslagruimte in de linkernavigatiekolom.
Vervolgens zul je merken dat er twee tabbladen bovenaan staan opslagruimte scherm: bestanden en Reglement.
Selecteer de Reglement tab en aan de lijn laat lezen, schrijven: if request.auth! = null;
, verandering !=
naar ==
en klik op de PUBLICEREN knop.
Nu moet elke gebruiker van uw app bestanden van uw Firebase-back-end kunnen uploaden of downloaden. Hoewel dit niet ideaal is voor een productieomgeving, wordt het leren van Firebase Storage een stuk eenvoudiger zonder in de verificatiecode te hoeven graven..
Het is geweldig om bestanden vanuit een app te kunnen uploaden, maar soms wil je eenvoudig bestanden opslaan die gemakkelijk kunnen worden geopend en ingetrokken in je app. Dit is waar het handmatig kan uploaden van bestanden uit de Firebase-console. Onder de bestanden tab zie je een blauwe knop met de titel Upload bestand.
Klik daarop en selecteer het bestand dat u wilt uploaden en het verschijnt in uw Firebase-opslag.
Als u dat bestand in de console selecteert, wordt een detailoverzicht weergegeven, zodat u bestanden kunt inspecteren die eerder zijn geüpload.
Nu u een bestand heeft opgeslagen in Firebase, gaan we door en trekken het naar een app. We gebruiken een eenvoudige lay-out in onze Hoofdactiviteit
dat bevat een Figuurweergave
Met een ID kaart
van afbeelding.
Als u toegang wilt krijgen tot uw Firebase-opslagbestanden, moet u eerst een verwijzing naar de FirebaseStorage
object en maak vervolgens een StorageReference
naar de URL van uw project en het bestand dat u wilt downloaden. U kunt de URL van uw project vinden bovenaan de bestanden gedeelte van opslagruimte in de Firebase-console.
FirebaseStorage-opslag = FirebaseStorage.getInstance (); StorageReference storageRef = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("android.jpg");
Vervolgens kunt u een maken het dossier
object en probeer het gewenste bestand te laden door te bellen getFile
op uw StorageReference
met het nieuwe het dossier
object doorgegeven als een parameter. Aangezien deze bewerking asynchroon gebeurt, kunt u een OnSuccessListener
en OnFailureListener
aan uw oproep om een van de eventualiteiten af te handelen.
probeer final File localFile = File.createTempFile ("images", "jpg"); storageRef.getFile (localFile) .addOnSuccessListener (new OnSuccessListener() @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Bitmap bitmap = BitmapFactory.decodeFile (localFile.getAbsolutePath ()); mImageView.setImageBitmap (bitmap); ). addOnFailureListener (new OnFailureListener () @Override public void onFailure (uitzondering @NonNull Exception) ); catch (IOException e)
In onSuccess ()
van OnSuccessListener
, je kunt de FileDownloadTask.TaskSnapshot
object en haal het bestand op, waar we de afbeelding op onze zullen instellen Figuurweergave
.
Als je het bestand alleen als een download moet downloaden byte[]
en heb het niet nodig als een bestand, wat waarschijnlijker is bij het laden van een afbeelding in een Figuurweergave
, dan kun je de bytes op dezelfde manier ophalen.
laatste lange ONE_MEGABYTE = 1024 * 1024; storageRef.getBytes (ONE_MEGABYTE) .addOnSuccessListener (new OnSuccessListener() @Override public void onSuccess (byte [] bytes) Bitmap bitmap = BitmapFactory.decodeByteArray (bytes, 0, bytes.length); mImageView.setImageBitmap (bitmap); );
Er kunnen situaties zijn waarbij u de feitelijke gegevens voor een opgeslagen bestand niet nodig hebt, maar liever de URL. U kunt dit op dezelfde manier doen als de laatste twee voorbeelden met behulp van de getDownloadUrl ()
methode op uw StorageReference
, wat je een zal geven Uri
wijzend naar de locatie van het bestand.
storageRef.getDownloadUrl (). addOnSuccessListener (nieuwe OnSuccessListener() @Override public void onSuccess (Uri uri) Log.e ("Tuts +", "uri:" + uri.toString ()); // Behandel alles wat u hier gaat doen met de URL);
De bovenstaande methode zal de URL afdrukken voor de afbeelding die we eerder eerder in de Android Monitor hebben geüpload.
E / Tuts +: uri: https://firebasestorage.googleapis.com/v0/b/tutsplus-firebase.appspot.com/o/android.jpg?alt=media&token=1828111c-78e7-4640-b418-c65e7571576a
Nu je weet hoe je bestanden van Firebase kunt downloaden, is het tijd om aan uploads te werken. Zoals u bij het downloaden van Firebase Storage zag, zijn de processen voor elke vorm van uw gegevens redelijk vergelijkbaar. Uploaden is niet anders, dus we duiken gewoon in hoe u bestanden van uw app naar Firebase-opslag kunt verplaatsen.
Net als bij het downloaden, moet u een verwijzing naar de FirebaseStorage
object en maak een verwijzing naar de opslaglocatie van uw nieuwe bestand als een StorageReference
. Voor dit voorbeeld zullen we laten zien ic_launcher.png in onze Figuurweergave
, en dan zullen we dat uploaden als een array van bytes.
FirebaseStorage-opslag = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("ic_launcher.png");
Vervolgens moeten we een bytearray verkrijgen via de image die in het geheugen is opgeslagen Figuurweergave
. Dit wordt gedaan door het op te halen als een Bitmap
, comprimeren tot een ByteArrayOutputStream
, en dan dat veranderen in een 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 = new ByteArrayOutputStream (); bitAdvisorpress (Bitmap.CompressFormat.JPEG, 100, outputStream); byte [] data = outputStream.toByteArray ();
Ten slotte kunt u een maken UploadTask
door te bellen putBytes (byte [])
om je afbeelding te uploaden naar Firebase. Deze UploadTask
kan ook een OnSuccessListener
en OnFailureListener
geassocieerd.
UploadTask uploadTask = storageReference.putBytes (data); uploadTask.addOnFailureListener (nieuwe OnFailureListener () @Override public void onFailure (uitzondering @NonNull Exception) ). addOnSuccessListener (new OnSuccessListener() @Override public void onSuccess (UploadTask.TaskSnapshot taskSnapshot) );
Wanneer u de Firebase Console-opslagpagina controleert, zou u dit moeten zien ic_launcher.png in je lijst met bestanden.
InputStream
of bestandNu u weet hoe u een bytearray kunt uploaden, moeten de andere twee soorten uploads redelijk intuïtief zijn. Laten we zeggen dat we een tekstbestand hebben met de naam test.txt in onze map met onbewerkte bronnen. We kunnen dit lezen in een InputStream
en upload het vervolgens met behulp van de putStream (inputlijn)
methode van StorageReference
.
FirebaseStorage-opslag = 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);
Het uploaden van een bestaand bestand is net zo eenvoudig: u krijgt gewoon een verwijzing naar het bestand en belt Putfile (Uri)
met een URI naar uw bestand. Voor dit voorbeeld maken we gewoon een leeg tijdelijke bestand in onze code.
FirebaseStorage-opslag = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("test2.txt"); Bestandsbestand = null; probeer file = File.createTempFile ("test2", "txt"); catch (IOException e) UploadTask uploadTask = storageReference.putFile (Uri.fromFile (bestand));
Hoewel de bestanden die we tot nu toe hebben geüpload, klein waren, kunnen er soms momenten zijn waarop je grotere uploads hebt die behoorlijk veel tijd in beslag nemen. Firebase biedt een aantal methoden met UploadTask
waarmee je de stroom van een upload kunt regelen en voortgang en statuswijzigingen kunt beluisteren. Deze methoden omvatten pauze()
, hervatten()
, en annuleren()
. pauze()
en hervatten()
laat je pauzeren en hervatten een UploadTask
, terwijl annuleren()
zal het volledig stoppen. Bovendien kunt u een OnPauseListener
en OnProgressListener
om de voortgang van de upload te volgen en de status te pauzeren.
mPause = (Button) findViewById (R.id.pause); mResume = (Button) findViewById (R.id.resume); mPause.setOnClickListener (nieuwe View.OnClickListener () @Override public void onClick (View view) mUploadTask.pause ();); mResume.setOnClickListener (nieuwe View.OnClickListener () @Override public void onClick (View view) mUploadTask.resume ();); FirebaseStorage-opslag = 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 (nieuwe OnPausedListener() @Override public void onPaused (UploadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "upload gepauzeerd!"); ); mUploadTask.addOnProgressListener (nieuwe OnProgressListener () @Override public void onProgress (UploadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "Bytes uploaded:" + taskSnapshot.getBytesTransferred ()); );
Met de bovenstaande code kun je het uploadproces regelen voor een enigszins grote afbeelding (in dit geval) van 1 MB en zie je de toestanden die veranderen in het Android-logboek wanneer de pauze- en hervattingsknoppen worden ingedrukt.
E / Tuts +: Bytes geüpload: 524288 E / Tuts +: uploaden onderbroken! E / Tuts +: Bytes geüpload: 786432
Zoals elke Android-ontwikkelaar kan bevestigen, kan de levensduur van de Android-activiteit soms onverwachte problemen veroorzaken. Een van de veelvoorkomende problemen is luisteraars die langer meegaan dan hun ouder Activiteit
, Dit kan het geval zijn voor succes / faal luisteraars die zijn gekoppeld aan een Firebase-opslagtaak.
Als een Activiteit
wordt vernietigd en nagebootst (zoals op schermrotatie) terwijl een taak zich voordoet, kunt u eindigen met een NullPointerException
wanneer de taak is voltooid. Om dit te voorkomen, wilt u uw opslaan StorageReference
als een Draad
in je uit staat Bundel
in de onSaveInstanceState (bundel)
methode en haal deze vervolgens op en voeg succesvolle luisteraars toe aan elke methode FileDownloadTask
of FileUploadTask
geassocieerd met dat StorageReference
.
@Override beschermde leegte onSaveInstanceState (bundel outState) super.onSaveInstanceState (outState); if (mStorageReference! = null) outState.putString (EXTRA_STORAGE_REFERENCE_KEY, mStorageReference.toString ()); @Override protected void onRestoreInstanceState (Bundle savedInstanceState) super.onRestoreInstanceState (savedInstanceState); final String stringRef = savedInstanceState.getString (EXTRA_STORAGE_REFERENCE_KEY); if (stringRef == null) terug; mStorageReference = FirebaseStorage.getInstance (). getReferenceFromUrl (stringRef); Lijsttaken = mStorageReference.getActiveDownloadTasks (); for (FileDownloadTask-taak: taken) task.addOnSuccessListener (this, new OnSuccessListener () @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "download succesvol!"); );
In deze zelfstudie heeft u veel geleerd over Firebase en de beschikbare opties voor bestandsopslag. U zou nu in staat moeten zijn om bestanden te uploaden en te downloaden, gegevensoverdrachten te beheren en veranderingen in de levenscyclus van uw app aan te kunnen tijdens een transactie.
Hoewel we net het oppervlak hebben ingekaderd van wat u in Firebase kunt doen, kunt u met deze tool hopelijk de mogelijkheden van uw eigen apps uitbreiden en geweldige ervaringen bieden voor uw gebruikers..
En bekijk in de tussentijd een aantal van onze andere artikelen over Android-ontwikkeling!