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);
どんな助けでも大歓迎です。ありがとう!
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を明示的に設定する必要があります。ここを見てください ピカソでディスクキャッシュを使用するにはどうすればよいですか?
通知してくれた@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'
古い答え:
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);
私も同じ問題を抱えていました。考えられるすべての方法を試しましたが、修正できませんでした。問題は、Firebaseストレージによって生成されたリンクにあると思います。ピカソは通常、ロードした画像をキャッシュします。私はcloudinary、リンクが画像形式(Eg:.jpg)で終わり、picassoがこれらのリンク画像をキャッシュするLibPixelのような他のクラウドサービスを試しました。 Firebaseリンクはトークン番号で終わります。それが失敗する奇妙なこと!