2016-06-08 12 views
7

Ich suche nach einem Weg, Bilder aus dem Speicher auf Google Firebase-Plattform zwischenzuspeichern. Momentan kann ich Bilder herunterladen und diese den Benutzern zeigen, aber ich bin nicht in der Lage, dies zu speichern und auf sie zuzugreifen, auch ohne Internetverbindung. Auf die Datenbank kann offline zugegriffen werden. Also dachte ich, es gäbe auch einen Weg für die Lagerung. Ich möchte nicht jedes einzelne Bild in den Speicher laden, denn dann müsste ich jedes Mal überprüfen, ob das Bild noch aktuell ist, es kann geändert werden. Hier sind ein paar Links, was ich finden konnte, aber keine Antwort auf meine Frage. Vielleicht kennt jemand einen Workaround oder einen Weg, wie man es schafft. Vielen Dank!Cache Bilder lokal, von Google Firebase Speicher

Herunterladen von Dateien: https://firebase.google.com/docs/storage/android/download-files

Cache (offline) Datenbank: https://firebase.google.com/docs/database/android/offline-capabilities

UPDATE 1

Hier ist, wie ich "Cache" Dateien mit picasso, I-Aktivität hinzugefügt, das sich interessiert der download:

Picasso.with(getApplicationContext()) 
          .load(uri.toString()) 
          .networkPolicy(NetworkPolicy.OFFLINE) 
          .into(image1); 

Jede Hilfe ist willkommen. Vielen Dank!

+0

können Sie Bilder selbst zwischenspeichern? LRU und andere Typen – Shubhank

Antwort

8

Ich fürchte, das Firebase SDK bietet kein Image-Caching für sich. Aber es gibt mehrere große Bibliotheken, die es für Sie tun könnten. Sie laden das Bild herunter, zeigen es in einem ImageView und speichern es in einer einzigen Codezeile. Fordern Sie einfach die Firebase für eine Bild-Download-URL an und füttern Sie sie in die Image-Caching-Bibliothek.

So etwas wie dies, wenn Sie Picasso als Caching-Bibliothek wählen:

storageRef.child("users/me/profile.png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { 
    @Override 
    public void onSuccess(Uri uri) { 
     // Got the download URL for 'users/me/profile.png' 
     // Pass it to Picasso to download, show in ImageView and caching 
     Picasso.with(context).load(uri.toString()).into(imageView); 
    } 
}).addOnFailureListener(new OnFailureListener() { 
    @Override 
    public void onFailure(@NonNull Exception exception) { 
     // Handle any errors 
    } 
}); 

UPD: Disk-Caching, um mit Picasso verwenden müssen Sie explizit Setup OkHttpDownloader zu. Schau hier How do I use disk caching in Picasso?

+2

Ich habe Picasso schon einmal ausprobiert, genau so wie du es gemacht hast. Die Sache ist, wenn ich die App ohne Internet neu starte, erscheinen Bilder nicht ... gibt es etwas, das ich sagen muss, um die Bilder zu speichern? Oder brauche ich eine Speichergenehmigung? – Wladislaw

+0

Richtig, es gibt einen Haken: Um Disk-Caching mit Picasso zu verwenden, müssen Sie OkHttpDownloader explizit einrichten. Schau hier http://stackoverflow.com/questions/23978828/how-doi-i-use-disk-caching-in-picasso –

+0

Okay, ich habe dieses implementiert. Jetzt kann ich blaues Symbol sehen, das bedeutet, dass es auf der Festplatte ist. Aber jedes Mal, wenn ich mich vom Wifi abkopple, und werde offline, das ist, was ich in Logcat bekomme ... 'W/ExponentialBackoff: Netzwerk nicht verfügbar, schlafen. – Wladislaw

1

Ich hatte das gleiche Problem. Versucht alle möglichen Wege, aber konnte das nicht beheben. Ich denke, das Problem liegt in den Links, die vom Firebase-Speicher generiert werden. Picasso speichert im Allgemeinen die Bilder, die es lädt. Ich habe andere Cloud-Dienste wie cloudinary, LibPixel ausprobiert, deren Links mit Bildformat enden (zB: .jpg) und Picasso speichert diese Linkbilder. Während Firebase-Links mit Token-Nummern enden. Seltsames Ding, es scheitert!

3

Dank @ATom für die Ankündigung. Api hat sich geändert und FirebaseUI 3.0 verwendet jetzt Glide 4.x Hier wird aktualisiert Beispiel:

ein Bild von einem StorageReference, erste Register in Ihrem AppGlideModule zu laden:

@GlideModule 
public class MyAppGlideModule extends AppGlideModule { 

    @Override 
    public void registerComponents(Context context, Glide glide, Registry registry) { 
     // Register FirebaseImageLoader to handle StorageReference 
     registry.append(StorageReference.class, InputStream.class, 
       new FirebaseImageLoader.Factory()); 
    } 
} 

Dann Sie eine StorageReference in eine Image laden kann:

// Reference to an image file in Cloud Storage 
StorageReference storageReference = ...; 

// ImageView in your Activity 
ImageView imageView = ...; 

// Download directly from StorageReference using Glide 
// (See MyAppGlideModule for Loader registration) 
GlideApp.with(this /* context */) 
     .load(storageReference) 
     .into(imageView); 

Und vergessen Sie nicht, Abhängigkeit in Ihrem build.gradle hinzuzufügen:

implementation 'com.firebaseui:firebase-ui-:3.1.0' 

Answer source on GitHub

Alte Antwort:

FirebaseUI 1.0 jetzt freigegeben. Speicherbeispiel hat Klasse FirebaseImageLoader

Bilder mit FirebaseImageLoader angezeigt zwischengespeichert werden, von ihrem Weg in Firebase Lagerung wird so wiederholt Lasten schnell und Bandbreite sparen.

// Reference to an image file in Firebase Storage 
    StorageReference storageReference = ...; 

    // ImageView in your Activity 
    ImageView imageView = ...; 

    // Load the image using Glide 
    Glide.with(this /* context */) 
      .using(new FirebaseImageLoader()) 
      .load(storageReference) 
      .into(imageView); 
+0

Diese Antwort gilt nur für Glide 3.X und ältere Version von FirebaseUI. Im GLide 4.X gibt es noch keine Methode, die() verwendet. – ATom