Während der Google I / O-Konferenz 2016 wurde Firebase als wichtiges Instrument für die schnelle Back-End-Unterstützung von Webseiten und mobilen Anwendungen wieder in die Entwicklergemeinde aufgenommen. In diesem Lernprogramm werden Sie mit den Funktionen zum Speichern und Abrufen von Dateien für Android-Apps vertraut gemacht.
Weitere Informationen über die Echtzeitdatenbank von Firebase, Analysen, Absturzberichte und Authentifizierung finden Sie in unseren anderen Tutorials zu Envato Tuts+.
Der Kürze halber überspringen wir den allgemeinen Einrichtungsprozess für Firebase in Ihrer Android-App und der Firebase-Konsole. Wenn Sie Firebase zum ersten Mal in einer App ausprobieren, empfiehlt es sich, zunächst Ashraff Hathibelagals Artikel Erste Schritte mit Firebase für Android zu lesen.
Bevor Sie mit der Verwendung von Firebase Storage beginnen können, müssen Sie entweder sicherstellen, dass Ihr Benutzer authentifiziert ist, oder die Regeln für die Authentifizierungsanforderungen in der Firebase-Konsole ändern, damit nicht authentifizierte Benutzer auf Dateien zugreifen und sie hochladen können. Um es einfach zu halten, machen wir das letztere. Beginnen wir mit dem Speicherbereich von Firebase, indem Sie auswählen Lager in der linken Navigationsspalte.
Als Nächstes werden Sie feststellen, dass sich oben zwei Registerkarten befinden Lager Bildschirm: Dateien und Regeln.
Wähle aus Regeln Tab und auf der Linie Lesen erlauben, schreiben: if request.auth! = null;
, Veränderung !=
zu ==
und klicken Sie auf die VERÖFFENTLICHEN Taste.
Nun sollte jeder Benutzer Ihrer App in der Lage sein, Dateien von Ihrem Firebase-Backend aus hochzuladen oder herunterzuladen. Dies ist zwar nicht ideal für eine Produktionsumgebung, aber es macht das Erlernen von Firebase Storage viel einfacher, ohne sich in den Authentifizierungscode einarbeiten zu müssen.
Das Hochladen von Dateien aus einer App ist zwar großartig, aber manchmal möchten Sie einfach Dateien an einem Ort speichern, auf den Sie einfach zugreifen und ihn in Ihre App ziehen können. Hier können Sie Dateien manuell über die Firebase Console hochladen. Unter dem Dateien Auf der Registerkarte sehen Sie eine blaue Schaltfläche mit dem Titel Datei hochladen.
Klicken Sie darauf und wählen Sie die Datei aus, die Sie hochladen möchten. Die Datei wird in Ihrem Firebase-Speicher angezeigt.
Wenn Sie diese Datei in der Konsole auswählen, wird eine Detailansicht angezeigt, in der Sie die zuvor hochgeladenen Dateien überprüfen können.
Nachdem Sie eine Datei in Firebase gespeichert haben, können Sie sie jetzt in eine App laden. Wir verwenden ein einfaches Layout in unserem Hauptaktivität
das enthält ein Bildansicht
mit einem Ich würde
von Bild.
Um auf Ihre Firebase Storage-Dateien zugreifen zu können, müssen Sie zunächst einen Verweis auf die FirebaseStorage
Objekt und erstellen Sie dann eine StorageReference
auf die URL Ihres Projekts und die Datei, die Sie herunterladen möchten. Sie finden die URL Ihres Projekts oben im Dateien Abschnitt von Lager in der Firebase-Konsole.
FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageRef = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("android.jpg");
Als Nächstes können Sie ein erstellen Datei
Objekt und versuchen Sie, die gewünschte Datei durch Aufrufen zu laden eine Datei bekommen
auf Ihrem StorageReference
mit dem neuen Datei
Objekt als Parameter übergeben. Da dieser Vorgang asynchron erfolgt, können Sie ein hinzufügen OnSuccessListener
und OnFailureListener
zu Ihrem Anruf, um beide Eventualitäten abzuwickeln.
try final File localFile = File.createTempFile ("images", "jpg"); storageRef.getFile (localFile) .addOnSuccessListener (neuer OnSuccessListener() @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Bitmap Bitmap = BitmapFactory.decodeFile (localFile.getAbsolutePath ()); mImageView.setImageBitmap (Bitmap); ). addOnFailureListener (neuer OnFailureListener () @Override public void onFailure (@NonNull-Ausnahmebedingung) ); catch (IOException e)
Im onSuccess ()
von OnSuccessListener
, Sie können das nehmen FileDownloadTask.TaskSnapshot
Objekt und ruft die Datei ab, wo wir das Bild auf unser Bild setzen Bildansicht
.
Wenn Sie die Datei nur als Byte[]
und brauche es nicht als Datei, was beim Laden eines Bildes in eine Bildansicht
, dann können Sie die Bytes auf ähnliche Weise abrufen.
letzte lange ONE_MEGABYTE = 1024 * 1024; storageRef.getBytes (ONE_MEGABYTE) .addOnSuccessListener (neuer OnSuccessListener() @Override public void onSuccess (byte [] bytes) Bitmap-Bitmap = BitmapFactory.decodeByteArray (Bytes, 0, Bytes.length); mImageView.setImageBitmap (Bitmap); );
Es kann Situationen geben, in denen Sie nicht die tatsächlichen Daten für eine gespeicherte Datei benötigen, sondern die URL. Sie können dies auf ähnliche Weise wie bei den letzten beiden Beispielen tun, indem Sie das verwenden getDownloadUrl ()
Methode auf Ihrem StorageReference
, das gibt dir eine Uri
zeigt auf den Speicherort der Datei.
storageRef.getDownloadUrl (). addOnSuccessListener (neuer OnSuccessListener)() @Override public void onSuccess (Uri uri) Log.e ("Tuts +", "uri:" + uri.toString ()); // Behandle alles, was du mit der URL hier machen willst);
Bei der obigen Methode wird die URL für das Bild gedruckt, das wir zuvor manuell im Android Monitor hochgeladen haben.
E / Tuts +: uri: https://firebasestorage.googleapis.com/v0/b/tutsplus-firebase.appspot.com/o/android.jpg?alt=media&token=1828111c-78e7-4640-b418-c65e7571576a
Nun, da Sie wissen, wie Sie Dateien von Firebase herunterladen, ist es an der Zeit, an Uploads zu arbeiten. Wie Sie beim Herunterladen von Firebase Storage gesehen haben, sind die Prozesse für jede Form Ihrer Daten ziemlich ähnlich. Das Hochladen ist nicht anders. Wir werden also einfach näher darauf eingehen, wie Sie Dateien von Ihrer App in Firebase Storage verschieben können.
Wie beim Herunterladen benötigen Sie einen Verweis auf die FirebaseStorage
Objekt und erstellen Sie einen Verweis auf den Speicherort Ihrer neuen Datei als StorageReference
. Für dieses Beispiel werden wir zeigen ic_launcher.png in unserer Bildansicht
, und dann laden wir das als Array von Bytes hoch.
FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("ic_launcher.png");
Als nächstes müssen wir ein Byte-Array aus dem im Speicher gespeicherten Bild über die Bildansicht
. Dies geschieht durch Abrufen als Bitmap
, komprimieren es in ein ByteArrayOutputStream
, und dann das in eine 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 (); bitmap.compress (Bitmap.CompressFormat.JPEG, 100, outputStream); byte [] data = outputStream.toByteArray ();
Schließlich können Sie ein erstellen UploadTask
durch anrufen putBytes (Byte [])
, um Ihr Bild in Firebase hochzuladen. Diese UploadTask
kann auch eine haben OnSuccessListener
und OnFailureListener
mit ihr verbundenen.
UploadTask uploadTask = storageReference.putBytes (Daten); uploadTask.addOnFailureListener (neuer OnFailureListener () @Override public void onFailure (@NonNull-Ausnahmebedingung) ). addOnSuccessListener (neuer OnSuccessListener() @Override public void onSuccess (UploadTask.TaskSnapshot taskSnapshot) );
Wenn Sie die Firebase Console-Speicherseite überprüfen, sollte dies angezeigt werden ic_launcher.png in Ihrer Liste der Dateien.
Eingabestrom
oder DateiDa Sie nun wissen, wie Sie ein Byte-Array hochladen, sollten die beiden anderen Upload-Typen recht intuitiv sein. Nehmen wir an, wir haben eine Textdatei mit dem Namen test.txt in unserem Rohstoffordner. Wir können das in ein lesen Eingabestrom
und laden Sie es dann mit der putStream (InputStream)
Methode von 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);
Das Hochladen einer vorhandenen Datei ist genauso einfach: Holen Sie einfach einen Verweis auf die Datei und rufen Sie an putFile (Uri)
mit einem URI, der auf Ihre Datei verweist. In diesem Beispiel erstellen wir einfach eine leere temporäre Datei in unserem Code.
FirebaseStorage storage = FirebaseStorage.getInstance (); StorageReference storageReference = storage.getReferenceFromUrl ("gs: //tutsplus-firebase.appspot.com") .child ("test2.txt"); Datei datei = null; try file = File.createTempFile ("test2", "txt"); catch (IOException e) UploadTask uploadTask = storageReference.putFile (Uri.fromFile (Datei));
Während die bisher hochgeladenen Dateien klein waren, kann es vorkommen, dass Sie größere Uploads haben, die recht viel Zeit in Anspruch nehmen können. Firebase bietet einige Methoden mit UploadTask
Auf diese Weise können Sie den Fluss eines Uploads steuern und den Fortschritt und Statusänderungen überwachen. Diese Methoden umfassen Pause()
, fortsetzen()
, und stornieren()
. Pause()
und fortsetzen()
lässt dich innehalten und wieder aufnehmen UploadTask
, wohingegen stornieren()
werde es völlig aufhalten. Zusätzlich können Sie eine OnPauseListener
und OnProgressListener
um den Upload-Fortschritt und den Pausestatus zu verfolgen.
mPause = (Button) findViewById (R.id.pause); mResume = (Button) findViewById (R.id.resume); mPause.setOnClickListener (new View.OnClickListener () @Override public void onClick (Ansicht anzeigen) mUploadTask.pause ();); mResume.setOnClickListener (new View.OnClickListener () @Override public void onClick (Ansicht anzeigen) 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 (neuer OnPausedListener() @Override public void onPaused (UploadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "Upload angehalten!"); ); mUploadTask.addOnProgressListener (neuer OnProgressListener () @Override public void onProgress (UploadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "Bytes uploaded:" + taskSnapshot.getBytesTransferred ()); );
Mit dem obigen Code können Sie den Upload-Vorgang für ein etwas großes Bild (in diesem Fall 1 MB) steuern und den Status des Android-Protokolls ändern, wenn Sie auf die Schaltflächen Pause und Fortsetzen drücken.
E / Tuts +: Hochgeladene Bytes: 524288 E / Tuts +: Upload angehalten! E / Tuts +: Hochgeladene Bytes: 786432
Wie jeder Android-Entwickler bestätigen kann, kann der Android-Aktivitätslebenszyklus manchmal unerwartete Probleme verursachen. Eine der häufigsten Problemquellen sind Zuhörer, die länger halten als ihre Eltern Aktivität
, Dies kann der Fall sein, wenn Listener für den Erfolg / Misserfolg einer Firebase-Speicheraufgabe zugeordnet sind.
Wenn ein Aktivität
zerstört wird und neu erstellt wird (z. B. bei einer Bildschirmdrehung), während eine Aufgabe ausgeführt wird, erhalten Sie möglicherweise eine NullPointerException
wenn die Aufgabe abgeschlossen ist. Um dies zu vermeiden, sollten Sie Ihr speichern StorageReference
Als ein String
in deinem Out-Zustand Bündeln
in dem onSaveInstanceState (Bundle)
Methode, und rufen Sie es dann ab und fügen Sie jedem Erfolgshörer hinzu FileDownloadTask
oder FileUploadTask
damit verbunden StorageReference
.
@Override protected void onSaveInstanceState (Bundle 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) return; mStorageReference = FirebaseStorage.getInstance (). getReferenceFromUrl (stringRef); ListeAufgaben = mStorageReference.getActiveDownloadTasks (); for (FileDownloadTask Task: Aufgaben) task.addOnSuccessListener (dieser neue OnSuccessListener () @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "Download erfolgreich!"); );
In diesem Tutorial haben Sie viel über Firebase und die verfügbaren Optionen für die Dateispeicherung erfahren. Sie sollten jetzt in der Lage sein, Dateien hoch- und herunterzuladen, Datenübertragungen zu steuern und Änderungen im Aktivitätslebenszyklus Ihrer App zu handhaben, während eine Transaktion ausgeführt wird.
Wir haben gerade die Oberfläche der Möglichkeiten von Firebase gekratzt. Wenn Sie sich mit diesem Tool jedoch auskennen, können Sie hoffentlich die Möglichkeiten Ihrer eigenen Apps erweitern und Ihren Benutzern großartige Erlebnisse bieten.
In der Zwischenzeit finden Sie einige unserer anderen Artikel zur Android-Entwicklung!