使用Firebase Storage的图片与Glide结合展示

12

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

首先,我正在使用文档

    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:请求抛出未捕获的throwable com.bumptech.glide.Registry$NoModelLoaderAvailableException:找不到任何模型加载器的模型:gs://123...appspot.com/sorular/1.jpg在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) 在com.bumptech.glide.load.engine.executor.GlideExecutor $ DefaultThreadFactory $ 1.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'
}

你能分享一下build.gradle文件吗? - AskNilesh
我已经添加了依赖,这样就足够了吗? - mehmet
你需要降级版本。 - GGWP
7个回答

24

改变这个:

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

变成这样:

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

根据 Glide 文档:

using()

Glide 4 中移除了 using() API,鼓励用户通过注册 AppGlideModule 来避免对象重用。您可以在 AppGlideModule 中注册 ModelLoader,而不是每次加载图像时创建新的 ModelLoader,并让 Glide 检查您传递给 load() 的模型(即对象)以确定何时使用已注册的 ModelLoader。

为了确保您仅将 ModelLoader 用于某些模型,您需要像上面显示的那样实现 handles() 方法以检查每个模型并仅在应该使用您的 ModelLoader 时返回 true。

Glide 4 中已删除 using()

解决此问题,您需要执行以下操作: 要从 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类并进行干净的构建后,您可以使用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


你确定吗?因为我已经更改了,但是".using(new FirebaseImageLoader())"仍然无法解决。在我看来,问题可能与Glide有关。 - mehmet
是的 https://github.com/firebase/FirebaseUI-Android/issues/731,https://github.com/firebase/FirebaseUI-Android/pull/802。方法 using(..) 是为 glide 4.0 版本而设计的,并且在 github 页面的最后,他们增加了对 firebaseui 3.0 版本中 glide 4.0 的支持。 - Peter Haddad
使用这个Glide库 compile 'com.github.bumptech.glide:glide:4.0.0-RC1' @mehmet 在更改后,重新同步、重建和清理。 - Peter Haddad
编译'com.github.bumptech.glide:glide:4.0.0-RC1' 实现'com.firebaseui:firebase-ui-storage:2.0.1' 仍然存在相同的错误,未能找到任何模型加载器用于模型:和如果使用 Firebase UI 3.2.1 应用程序无法打开。 - mehmet
让我们在聊天中继续这个讨论 - mehmet
显示剩余5条评论

6

我知道我有点迟了,但它可能会对你们中的一些人有所帮助。 在 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.

接着添加这个类:

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

最后,您需要转到“文件”->“无效缓存并重启” 完成 :)

2
最后你需要去文件->无效缓存并重启 - 救了我的两天时间!!!谢谢!!! - Vaha

4
如果您在Firebase存储上上传了小图标图像,请删除滑动和那个“模型”。它会对其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);
                    }
                });

使用这种方法的人:如果我们不使用 Glide,我们需要管理缓存。Glide 缓存 - Yogi

2

关于 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'


4
降级不被视为解决方案,尤其是当你降级到非常老的版本时。 - Rosário Pereira Fernandes

1

以上的答案对我没有帮助。

我的gradle中缺少了这个。

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

我找到的最好的文档在这里


0

Kotlin实现的GlideModule:

@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"
}

0

我正在使用 Kotlin。

在我的情况下,因为我仍然像这样使用注解处理器

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

我应该使用:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接