类 com.bumptech.glide.load.engine.GlideException:无法加载资源

44

我正在尝试通过 Glide 将一张图片加载到 imageView 中。但是图片无法加载 - 我得到了一个错误。

我正在使用以下代码:

GlideApp.with(context)
    .load(itemData.getThumbnailUri())
    .placeholder(R.mipmap.koya_logo_white)
    .error(R.mipmap.ic_image_loading_error)
    .into(itemBinding.cover);

日志

lide: Load failed for https://s3.amazonaws.com/koya-dev-videos/kindness/8da807aa-1e1e-413d-bf9b-5bb084646593/medialibrary/9456621508/videos/1eb78337-d569-41bd-95ad-153d9098de03.png with size [1080x1080]
class com.bumptech.glide.load.engine.GlideException: Failed to load resource
Cause (1 of 1): class com.bumptech.glide.load.engine.GlideException: Failed LoadPath{StringUri->Object->Drawable}, LOCAL, DataCacheKey{sourceKey=https://s3.amazonaws.com/koya-dev-videos/kindness/8da807aa-1e1e-413d-bf9b-5bb084646593/medialibrary/9456621508/videos/1eb78337-d569-41bd-95ad-153d9098de03.png, signature=EmptySignature}
Cause (1 of 2): class com.bumptech.glide.load.engine.GlideException: Failed DecodePath{StringUri->Drawable->Drawable}
Cause (2 of 2): class com.bumptech.glide.load.engine.GlideException: Failed DecodePath{StringUri->Bitmap->Drawable}

你正在使用哪个版本的Glide? - Hemant Parmar
我正在使用Glide 4.8.0版本。 - narender sharma
尝试在日志中打印 itemData.getThumbnailUri() 的值,并检查它是否为有效的URI格式。 - Rakhi Dhavale
1
你能找到解决问题的方法吗?我已经有两三天遇到了同样的问题。 - Huseyin Sahin
嘿!有解决方案吗?我在Android 22 API及以下版本上遇到了同样的问题 - 无法加载像相机4MP屏幕一样的URL,例如:https://fs05.naveksoft.com:62121/a109b1b0-4f05-45f2-9e55-35d672d13038/preview.mp4?token=e7638665ffdd79a0924b71bb0da12ed95e39981a-iVsYbGnEyq6scGe-1568397893-1568311493。 - nicolas asinovich
显示剩余4条评论
20个回答

6

出现这个问题的另一个原因是电话/模拟器没有互联网连接。


如果仍然没有生效,请尝试卸载并重新安装该应用。希望它能正常工作! - Mohd Asim

6
尝试这个解决方案...
String url = "https://s3.amazonaws.com/koya-dev-videos/kindness/8da807aa-1e1e-413d-bf9b-5bb084646593/medialibrary/9456621508/videos/1eb78337-d569-41bd-95ad-153d9098de03.png";
    
GlideApp.with(context).load(url)
        .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
        .error(R.drawable.glide_app_img_loader)
        .listener(new RequestListener<Drawable>() {
             @Override
             public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                 return false;
             }
    
             @Override
             public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                 return false;
             }
        }).into(imageView);

类 com.bumptech.glide.load.engine.GlideException: 资源加载失败 有 2 个原因: com.bumptech.glide.load.HttpException(禁止) com.bumptech.glide.load.HttpException(禁止) 调用 GlideException#logRootCauses(String) 获取更多详细信息 原因 (1/3): 类 com.bumptech.glide.load.engine.GlideException: 获取数据失败,类 java.io.InputStream,远程 - narender sharma
1
你确定你只使用了 HTTPS URL 吗? - VIISHRUT MAVANII
1
@VishrutMavani 谢谢你的好建议!我完全不知道原来可以这样做。 - Fattie
1
我没有使用URL,而是使用内部存储,并且使用目标尺寸的覆盖解决了问题!谢谢! - Hector Costa

5

最简单的解决方案

添加,

android:usesCleartextTraffic="true"

AndroidManifest.xml 文件的 <application/> 标签内。


1
@IlyaGazman 没错,目标 API 级别为 27 或更低的默认值为“true”。目标 API 级别为 28 或更高的应用程序默认为“false”。 - Kishan Solanki
它对我起作用了!在使用API级别8及以下时,您不需要这个,但是在处理API 8.1及以上版本时,您将需要这个特定的解决方案。 - Theophilus Abiola Alamu

5
这个解决方案对我有效:
1. 更新build.gradle(Module:app)
    implementation "com.github.bumptech.glide:glide:4.7.1"
        kapt "com.github.bumptech.glide:compiler:4.7.1"
        implementation "com.squareup.okhttp3:okhttp:3.14.0"
        implementation ('com.github.bumptech.glide:okhttp3-integration:4.7.1'){
            exclude group: 'glide-parent'
        }
  1. Set timeout for glide

     @GlideModule
        class MyAppGlideModule : AppGlideModule() {
            override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
                val client = OkHttpClient.Builder()
                    .readTimeout(30, TimeUnit.SECONDS)
                    .connectTimeout(30, TimeUnit.SECONDS)
                    .build()
                val factory = OkHttpUrlLoader.Factory(client)
                glide.registry.replace(GlideUrl::class.java, InputStream::class.java, factory)
            }
        }
    

2

将 Glide 版本更新至:

 implementation 'com.github.bumptech.glide:glide:4.14.2'
 annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2'

1
我也遇到了这个问题。这是Glide方面的错误。请使用最新版本的Glide。
repositories {
 mavenCentral()
 google()
}

dependencies {
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
}

确保itemData.getThumbnailUri()中不包含空格。


1
我也遇到了这个问题。当我像这样编写布局时:
<FrameLayout 
    android:layout_width="@dimen/view_width"
    android:layout_height="@dimen/view_height">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</FrameLayout>

而我把它改成了

<FrameLayout 
    android:layout_width="@dimen/view_width"
    android:layout_height="@dimen/view_height">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

这个解决方案对我有效。

0
创建像这样的图像解码器:
class PageDecoder(
    private val bitmapPool: BitmapPool
) : ResourceDecoder<InputStream, Bitmap> {

    companion object {
        val PAGE_DECODER: Option<Boolean> = Option.memory("abc")
    }

    override fun decode(source: InputStream, width: Int, height: Int, options: Options): Resource<Bitmap>? {
        return BitmapResource.obtain(BitmapFactory.decodeStream(source), bitmapPool)
    }

    override fun handles(source: InputStream, options: Options): Boolean = options.get(PAGE_DECODER) ?: false

}

在你的滑动模块中应用这个:
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        registry.prepend(InputStream::class.java, Bitmap::class.java, PageDecoder(glide.bitmapPool))
    }

在Activity中,如果要加载图像,请使用以下内容:
GlideApp.with(context)
        .load("Image url or path, etc")
        .apply(GlideOptions.option(PageDecoder.PAGE_DECODER, true))
        .into(imageview)

这对我有用,希望它对你也有帮助。


0
Glide.with(this)
   .load(imageItem.img_url.toUri().buildUpon().scheme("https").build())
   .into(mars_image)

尝试使用此扩展load(imageItem.img_url.toUri().buildUpon().scheme("https").build())来扩展您的URL以支持HTTPS。


0

对我来说,URL 是 "https//app.domain..",问题在于 URL 开头有一个空格。


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