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
相关产品推荐
相关产品推荐

