imagekotlinfilenotfoundexceptionloadimage

Glide FileNotFoundException


سلام عليكم

I want to load image with Glide but I got this error :

java.io.FileNotFoundException: https://via.placeholder.com/600/1e5390
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238)
        at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)
        at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java)
        at com.bumptech.glide.load.data.HttpUrlFetcher.loadDataWithRedirects(HttpUrlFetcher.java:102)
        at com.bumptech.glide.load.data.HttpUrlFetcher.loadData(HttpUrlFetcher.java:56)
        at com.bumptech.glide.load.engine.SourceGenerator.startNextLoad(SourceGenerator.java:70)
        at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:63)
        at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:310)
        at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:276)
        at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:234)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)
        at com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:393)

This is the image url: https://via.placeholder.com/600/1e5390

And this is the Glide code:

@BindingAdapter("imageUrl")
fun ImageView.bindImage( imgUrl: String?) {
        imgUrl?.let {
            val imgUri = imgUrl.toUri().buildUpon().scheme("https").build()
            Glide.with(this.context)
                .load(imgUri)
                .apply(
                    RequestOptions()
                        .error(R.drawable.ic_broken_image)
                )
              
                .into(this)

    }
}

And use it here :

<androidx.appcompat.widget.AppCompatImageView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:adjustViewBounds="true"
            android:scaleType="centerCrop"
            app:imageUrl="@{photoObject.photoUrl}"
            app:srcCompat="@drawable/ic_broken_image" />

Thank you :))


Solution

  • This solve my problem:

    val theImage = GlideUrl(
            imgUrl, LazyHeaders.Builder()
                .addHeader("User-Agent", "5")
                .build()
        )
    

    Add user agent header to Glide

    Full code :

    @BindingAdapter("imageUrl")
    fun ImageView.bindImage( imgUrl: String?) {
    
    
        val theImage = GlideUrl(
            imgUrl, LazyHeaders.Builder()
                .addHeader("User-Agent", "5")
                .build()
        )
    
        theImage.let {
            Glide.with(this.context)
                .load(theImage)
                .apply(
                    RequestOptions()
                        .error(R.drawable.ic_broken_image)
    
                )
                .into(object : CustomViewTarget<ImageView, Drawable>(this) {
                    override fun onLoadFailed(errorDrawable: Drawable?) {}
                    override fun onResourceCleared(placeholder: Drawable?) {}
                    override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
                        this@bindImage.setImageDrawable(resource)
                    }
                })    }
    }