在 Glide 中使用 Firebase 存储图像

Using Firebase Storage image with Glide

有很多重复的答案我几乎都试过了,但我仍然无法在 Glide 中使用 Firebase 存储图像。

首先我用的是docs

    FirebaseStorage storage  = FirebaseStorage.getInstance();
    StorageReference storageRef = storage.getReference();
    StorageReference pathReference = storageRef.child("sorular/1.jpg");

   // ImageView in your Activity
   ImageView imageView = rootView.findViewById(R.id.imageView);

   // Load the image using Glide
   Glide.with(this /* context */)
        .using(new FirebaseImageLoader()) // Cannot resolve method 'using
        .load(pathReference)
        .into(imageView);

如果我清理 Glide 的 .using 部分,logcat 它会给出这个错误:

E/GlideExecutor: Request threw uncaught throwable com.bumptech.glide.Registry$NoModelLoaderAvailableException: Failed to find any ModelLoaders for model: gs://123...appspot.com/sorular/1.jpg
at com.bumptech.glide.Registry.getModelLoaders(Registry.java:227)
at com.bumptech.glide.load.engine.DecodeHelper.getLoadData(DecodeHelper.java:179) at com.bumptech.glide.load.engine.DecodeHelper.getCacheKeys(DecodeHelper.java:197) at com.bumptech.glide.load.engine.ResourceCacheGenerator.startNext(ResourceCacheGenerator.java:41) at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:282) at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:249) at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:222)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761)
at com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory.run(GlideExecutor.java:347)

那么如何在我的 android 应用程序中以最佳方式使用 firebase 存储图像?

这也是我的构建 gradle 依赖项:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.0.2'
    implementation 'com.android.support:palette-v7:27.0.2'
    implementation "com.android.support:cardview-v7:27.0.2"
    implementation "com.android.support:recyclerview-v7:27.0.2"
    implementation "com.android.support:support-v4:27.0.2"
    implementation 'com.android.support:design:27.0.2'

    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    implementation 'com.github.florent37:materialviewpager:1.2.3'


    implementation 'com.google.firebase:firebase-database:11.8.0'
    implementation 'com.google.firebase:firebase-storage:11.8.0'
    implementation 'com.firebaseui:firebase-ui-storage:2.0.1'
    implementation 'com.google.firebase:firebase-auth:11.8.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

改变这个:

 implementation 'com.firebaseui:firebase-ui-storage:2.0.1'

对此:

  implementation 'com.firebaseui:firebase-ui-storage:3.2.1'

根据 Glide 文档:

using()

The using() API was removed in Glide 4 to encourage users to register their components once with a AppGlideModule to avoid object re-use. Rather than creating a new ModelLoader each time you load an image, you register it once in an AppGlideModule and let Glide inspect your model (the object you pass to load()) to figure out when to use your registered ModelLoader.

To make sure you only use your ModelLoader for certain models, implement handles() as shown above to inspect each model and return true only if your ModelLoader should be used.

using() 已从 Glide 4 中删除。

要解决此问题,您需要执行以下操作: 要从 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());
  }
}

创建 AppGlideModule class 并完成干净构建后,您可以使用 GlideApp 将 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);

更多信息在这里:https://github.com/firebase/FirebaseUI-Android/tree/master/storage

至于Glide 4.6.1不能使用.using(new FirebaseImageLoader())

我被迫降级到

implementation 'com.github.bumptech.glide:glide:3.8.0'

Firebase UI implementation'com.firebaseui:firebase-ui-storage:2.0.1'

以上回答对我没有帮助。

我在 gradle 中遗漏了这个。

annotationProcessor 'com.github.bumptech.glide:compiler:4.x' //For Kotlin advice use kapt instead of annotationProcessor

我找到的最好的文档是 here

如果您已将图标的小图像上传到您的 Firebase 存储,请摆脱 glide 和 "model"。它对其 git 进行了很多更改。所以你的代码应该是这样的:

   StorageReference referenseLcl = FirebaseStorage.getInstance().getReference();
                StorageReference islandRefLcl = referenseLcl.child(userLcl.getImageIconPath());
                final long ONE_MEGABYTE = 1024 * 1024;
                islandRefLcl.getBytes(ONE_MEGABYTE).addOnSuccessListener(bytesPrm -> {
                    Bitmap bmp = BitmapFactory.decodeByteArray(bytesPrm, 0, bytesPrm.length);
                    imageOfUser.setImageBitmap(bmp);
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception exception) {
                        imageOfUser.setImageResource(R.mipmap.ic_launcher);
                    }
                });

我知道我来晚了,但它可能会对你们中的一些人有所帮助。 在 app build.gradle.

中使用这两个
implementation 'com.github.bumptech.glide:glide:4.10.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0' //For Kotlin You should use kapt instead of annotationProcessor though.

然后添加这个Class:

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

 GlideApp.with(getActivity()).load(storageReference).into(profileImg);

最后您需要转到文件-> 使缓存无效并重新启动 完成:)

我正在使用 kotlin。

就我而言,因为我仍然像这样使用注解处理器

annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

我应该使用:

kapt 'com.github.bumptech.glide:compiler:4.11.0'

GlideModule 的 Kotlin 实现:

@GlideModule
class GlideModule : AppGlideModule() {

    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        registry.append(StorageReference::class.java, InputStream::class.java, FirebaseImageLoader.Factory())
    }

}

不要忘记导入正确的依赖项:

dependencies {
    def glide_version = "4.12.0"
    implementation "com.github.bumptech.glide:glide:$glide_version"
    kapt "com.github.bumptech.glide:compiler:$glide_version"
}