从Google Firebase存储缓存本地图片

时间:2016-06-08 10:17:48

标签: android caching firebase firebase-storage

我正在寻找一种方法,从谷歌firebase平台上的存储缓存图像。现在,我可以下载图像,并向用户显示这些图像,但即使没有互联网连接,我也无法缓存此图像并进行访问。可以脱机访问数据库。所以我想,还有一种存储方式。我不想将每个图像下载到存储器,因此我需要每次检查,如果图像仍然是最新的,则可能会更改。这里有一些链接,我能找到的,但我的问题没有答案。也许有人知道一种解决方法,或者一种如何实现它的方法。谢谢!

下载文件: https://firebase.google.com/docs/storage/android/download-files

缓存(离线)数据库: https://firebase.google.com/docs/database/android/offline-capabilities

更新1

以下是我"缓存"毕加索的文件,我添加了活动,关心下载:

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

欢迎任何帮助。谢谢!

3 个答案:

答案 0 :(得分:8)

我担心Firebase SDK本身不提供图像缓存。但是有几个很棒的库可以帮到你。他们下载图像,在ImageView中显示它并将其缓存在一行代码中。只需向Firebase请求图片下载网址并将其提供给图片缓存库。

如果您选择Picasso作为缓存库,请执行以下操作:

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:要使用Picasso进行磁盘缓存,您需要显式设置OkHttpDownloader。看这里How do I use disk caching in Picasso?

答案 1 :(得分:6)

感谢@ATom的通知。 Api已更改,FirebaseUI 3.0现在使用Glide 4.x. 这是更新的样本:

  

要从StorageReference加载图像,请先在您的   AppGlideModule:

People
     

然后,您可以将StorageReference加载到ImageView:

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

不要忘记在// 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); 中添加依赖项:

build.gradle

Answer source on GitHub

旧回答:

FirebaseUI 1.0现已发布。存储示例具有类FirebaseImageLoader

  

使用FirebaseImageLoader显示的图像由其路径缓存   Firebase存储,因此重复加载将是快速和节省的   带宽。

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

答案 2 :(得分:1)

我有同样的问题。尝试了所有可能的方法,但无法解决这个问题。我认为问题在于firebase存储生成的链接。毕加索通常会缓存它加载的图像。我尝试了其他云服务,如cloudinary,LibPixel,其链接以图像格式(例如:.jpg)结束,毕加索缓存这些链接图像。虽然firebase链接以令牌号结束。奇怪的是它失败了!