You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Glide加载Firebase Storage图片遇Registry$NoModelLoaderAvailableException错误

解决Glide加载Firebase Storage图片的NoModelLoaderAvailableException异常

这个问题我之前帮开发者排查过很多次啦,核心原因就是Glide默认没有内置处理Firebase Storage的StorageReference或者gs://格式链接的加载器,所以才会抛出找不到ModelLoader的异常。给你两个靠谱的解决方案,按需选择:

方案一:使用FirebaseUI的Glide集成(推荐)

这个方案是官方推荐的集成方式,配置简单且能自动处理Storage资源的加载逻辑:

1. 添加依赖

在你的Module级别的build.gradle文件中添加Glide基础依赖和FirebaseUI的Storage扩展:

dependencies {
    // Glide核心依赖(版本请根据自身项目调整,建议用最新稳定版)
    implementation 'com.github.bumptech.glide:glide:4.16.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0'
    
    // Firebase UI Storage集成库(版本要和Glide、Firebase版本匹配)
    implementation 'com.firebaseui:firebase-ui-storage:8.0.2'
}

注意:FirebaseUI版本需要和你的Firebase BOM版本兼容,比如FirebaseUI 8.x对应Firebase BOM 29.x左右,如果版本不匹配可能会出现冲突。

2. 修改加载代码

把原来的Glide.with()替换为FirebaseGlideApp.with(),同时简化StorageReference的获取方式(不用写完整的gs://链接,直接用存储路径更简洁):

public void onBindViewHolder(@NonNull final AlternateListHolder_Market holder, int position) {
    productsListOfMarketFirestore currentItem = filterList.get(position);
    
    // 直接通过路径获取StorageReference,不用完整的gs://链接
    StorageReference storageReference = FirebaseStorage.getInstance()
            .getReference("user_image1")
            .child(currentItem.getProductId() + ".jpg");
    
    // 使用FirebaseGlideApp加载资源
    FirebaseGlideApp.with(holder.imageView.getContext())
            .load(storageReference)
            .into(holder.imageView);
}

3. 可选:自定义Glide配置(如果需要)

如果你的项目有自定义Glide配置,需要创建一个继承自FirebaseGlideModule的类并添加@GlideModule注解,Rebuild项目后FirebaseGlideApp就会自动生成:

@GlideModule
public class MyCustomGlideModule extends FirebaseGlideModule {
    // 在这里添加你的自定义Glide配置,比如缓存策略、占位图默认设置等
}

方案二:获取下载URL后用普通Glide加载

如果不想引入FirebaseUI依赖,也可以先获取图片的公开下载URL,再用普通Glide加载:

修改加载代码

public void onBindViewHolder(@NonNull final AlternateListHolder_Market holder, int position) {
    productsListOfMarketFirestore currentItem = filterList.get(position);
    StorageReference storageReference = FirebaseStorage.getInstance()
            .getReference("user_image1")
            .child(currentItem.getProductId() + ".jpg");
    
    // 异步获取图片的下载URL
    storageReference.getDownloadUrl().addOnSuccessListener(uri -> {
        // 获取URL成功后,用普通Glide加载
        Glide.with(holder.imageView.getContext())
                .load(uri)
                .into(holder.imageView);
    }).addOnFailureListener(e -> {
        // 处理URL获取失败的情况,比如显示占位图
        Log.e("ImageLoadError", "Failed to get download URL", e);
        holder.imageView.setImageResource(R.drawable.your_placeholder_image);
    });
}

注意:这种方式是异步操作,要注意RecyclerView item复用的情况,不过Glide默认会自动取消之前的请求,避免加载错误的图片。


额外检查项

  • Storage权限规则:确保Firebase Storage的规则允许读取这些图片,测试阶段可以暂时设置为:
    rules_version = '2';
    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
          allow read: if true; // 上线后请替换为安全的权限逻辑,比如只允许登录用户读取
          allow write: if request.auth != null;
        }
      }
    }
    
  • 文件路径正确性:确认user_image1目录下确实存在{productId}.jpg文件,避免因路径拼写错误导致加载失败。

内容的提问来源于stack exchange,提问作者S. S. Saruar Jahan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:08:04