2016-06-08 69 views
7

Sto cercando un modo per memorizzare immagini dalla memoria sulla piattaforma google firebase. Per ora, posso scaricare le immagini e mostrarle agli utenti, ma non sono in grado di memorizzarle in cache e di accedervi, anche senza connessione a Internet. È possibile accedere al database offline. Così ho pensato, ci sarebbe stato anche un modo per immagazzinare. Non voglio scaricare ogni singola immagine nell'archivio, perché allora dovrei controllare ogni volta, se l'immagine è ancora aggiornata, potrebbe essere cambiata. Ecco alcuni link, quello che ho trovato, ma nessuna risposta alla mia domanda. Forse qualcuno conosce una soluzione alternativa o un modo per ottenerla. Grazie!Cache images local, from google firebase storage

file Download: https://firebase.google.com/docs/storage/android/download-files

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

UPDATE 1

ecco come lo file "cache" con Picasso, ho aggiunto l'attività, che si prende cura il download:

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

Qualsiasi aiuto è benvenuto. Grazie!

+0

È possibile memorizzare le immagini nella cache? LRU e altri tipi – Shubhank

risposta

8

Ho paura che l'SDK di Firebase non fornisca il caching delle immagini da solo. Ma ci sono molte grandi librerie che potrebbero farlo per te. Scaricano l'immagine, la mostrano in un ImageView e la memorizzano in una singola riga di codice. Richiedi l'URL di download di un'immagine per Firebase e inseriscilo nella libreria di memorizzazione immagini.

Qualcosa di simile a questo, se si sceglie Picasso come libreria di caching:

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: Per utilizzare la cache del disco con Picasso è necessario in modo esplicito l'installazione OkHttpDownloader. Guarda qui How do I use disk caching in Picasso?

+2

ho già provato Picasso, esattamente come hai fornito. Il fatto è che, se riavvio l'app, senza Internet, le immagini non vengono visualizzate ... c'è qualcosa che devo dire, per memorizzare le immagini? O forse ho bisogno di autorizzazione per l'archiviazione? – Wladislaw

+0

Esatto, c'è un problema: per utilizzare la memorizzazione nella cache del disco con Picasso è necessario impostare in modo esplicito OkHttpDownloader. Guarda qui http://stackoverflow.com/questions/23978828/how-do-i-use-disk-caching-in-picasso –

+0

Ok, ho implementato questo. Ora posso vedere il simbolo blu, cioè sul disco. Ma ogni volta che mi disconnetto dalla rete wifi, e diventa offline, questo è ciò che ottengo in Logcat ... 'W/ExponenentialBackoff: rete non disponibile, dormiente. – Wladislaw

1

Ho avuto lo stesso problema. Ho provato tutti i possibili modi ma non ho potuto risolverlo. Penso che il problema risieda nei link generati dalla memoria di Firebase. Picasso generalmente memorizza nella cache le immagini che carica. Ho provato altri servizi cloud come il cloud, LibPixel i cui collegamenti terminano con il formato dell'immagine (ad esempio: .jpg) e picasso memorizza nella cache queste immagini di collegamento. Mentre i link di Firebase terminano con numeri di token. Strana cosa fallisce!

3

Grazie a @ATom per l'avviso. Api è cambiato e FirebaseUI 3.0 ora usa Glide 4.campione x qui rappresentati sono:

Per caricare un'immagine da uno StorageReference, primo registro nel AppGlideModule:

@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()); 
    } 
} 

Poi si può caricare uno StorageReference in un ImageView:

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

E non dimenticare di aggiungere dipendenza nel tuo build.gradle:

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

Answer source on GitHub

Vecchia risposta:

FirebaseUI 1.0 ora rilasciato. Esempio di stoccaggio ha classe FirebaseImageLoader

Immagini visualizzate utilizzando FirebaseImageLoader vengono memorizzati nella cache per il loro percorso nel Firebase bagagli, così carichi ripetuti sarà veloce e conservare larghezza di banda.

// 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

Questa risposta è valida solo per Glide 3.X e versione precedente di FirebaseUI. In GLide 4.X non esiste già il metodo using(). – ATom