Firebase für Android Dateispeicherung

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+.

Authentifizierung einrichten

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.

Dateien manuell hochladen

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.

Herunterladen von Dateien von einer Android-App

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.

Dateien als Byte-Array herunterladen

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); );

URL einer Datei abrufen

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

Hochladen von einer Android-App

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.

Ein Byte-Array hochladen

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.

Hochladen von einem Eingabestrom oder Datei

Da 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));

Uploads steuern und Rückrufe verwenden

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

Umgang mit dem Android-Aktivitätslebenszyklus

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); Liste Aufgaben = mStorageReference.getActiveDownloadTasks (); for (FileDownloadTask Task: Aufgaben) task.addOnSuccessListener (dieser neue OnSuccessListener() @Override public void onSuccess (FileDownloadTask.TaskSnapshot taskSnapshot) Log.e ("Tuts +", "Download erfolgreich!"); ); 

Fazit

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!

  • Beginnen Sie mit dem Erstellen einer Material Design App

    In diesem Video aus meinem Kurs zum Erstellen einer Materialdesign-App erfahren Sie, wie Sie die Benutzeroberfläche einer Materialdesign-App erstellen. Du wirst lernen, wie…
    Ashraff Hathibelagal
    Android
  • Hintergrund-Audio in Android mit MediaSessionCompat

    Eine der beliebtesten Anwendungen für mobile Geräte ist die Audiowiedergabe über Musik-Streaming-Dienste, heruntergeladene Podcasts oder eine beliebige andere Anzahl von Audiodateien.
    Paul Trebilcox-Ruiz
    Android SDK
  • Erste Schritte mit einer Android-App-Vorlage

    CodeCanyon bietet Hunderte von Android-App-Vorlagen, mit denen Sie die Entwicklung Ihrer nächsten App vorantreiben können. In diesem Tutorial helfe ich Ihnen beim Einstieg…
    Ashraff Hathibelagal
    Android
  • Neuerungen in Android Studio 2.2?

    Die letzten Monate waren eine aufregende Zeit für Android Studio. Zuerst kam Version 2.1 mit Unterstützung für Android N. Dann brachte Google I / O eine Vorschau von…
    Jessica Thornsby
    Android