web-dev-qa-db-ja.com

GoogleFirebaseストレージからローカルに画像をキャッシュする

GoogleFirebaseプラットフォームのストレージから画像をキャッシュする方法を探しています。今のところ、画像をダウンロードしてユーザーに表示することはできますが、インターネットに接続していなくても、これをキャッシュしてアクセスすることはできません。データベースにはオフラインでアクセスできます。だから、収納する方法もあるのではないかと思いました。すべてのイメージをストレージにダウンロードしたくないので、毎回チェックする必要があります。イメージがまだ最新の場合は、変更される可能性があります。ここにいくつかのリンクがあります。私が見つけたものですが、私の質問に対する答えはありません。たぶん誰かが回避策、またはそれを達成する方法を知っています。ありがとう!

ファイルのダウンロード: https://firebase.google.com/docs/storage/Android/download-files

キャッシュ(オフライン)データベース: https://firebase.google.com/docs/database/Android/offline-capabilities

UPDATE 1

これが私がピカソでファイルを「キャッシュ」する方法です、私はダウンロードを気にする活動を追加しました:

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

どんな助けでも大歓迎です。ありがとう!

8
Wladislaw

FirebaseSDKはそれ自体では画像キャッシュを提供していません。しかし、あなたのためにそれを行うことができるいくつかの素晴らしいライブラリがあります。画像をダウンロードし、ImageViewに表示して、1行のコードにキャッシュします。 Firebaseに画像のダウンロードURLをリクエストして、画像キャッシュライブラリにフィードするだけです。

キャッシュライブラリとして 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を明示的に設定する必要があります。ここを見てください ピカソでディスクキャッシュを使用するにはどうすればよいですか?

9

通知してくれた@ATomに感謝します。 Apiが変更され、FirebaseUI3.0はGlide4.xを使用するようになりました。更新されたサンプルは次のとおりです。

StorageReferenceから画像をロードするには、最初に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());
    }
}

次に、StorageReferenceを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);

そして、build.gradleに依存関係を追加することを忘れないでください:

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

GitHubの回答ソース

古い答え:

FirebaseUI1.0がリリースされました。ストレージの例にはクラスがあります FirebaseImageLoader

FirebaseImageLoaderを使用して表示される画像は、Firebase Storageのパスによってキャッシュされるため、繰り返し読み込まれると高速になり、帯域幅が節約されます。

    // 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);
6
Dima Rostopira

私も同じ問題を抱えていました。考えられるすべての方法を試しましたが、修正できませんでした。問題は、Firebaseストレージによって生成されたリンクにあると思います。ピカソは通常、ロードした画像をキャッシュします。私はcloudinary、リンクが画像形式(Eg:.jpg)で終わり、picassoがこれらのリンク画像をキャッシュするLibPixelのような他のクラウドサービスを試しました。 Firebaseリンクはトークン番号で終わります。それが失敗する奇妙なこと!

1
Nihal