Glide не может загрузить изображение

У меня есть простой макет с ImageView

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.vbusovikov.glidetest.MainActivity">

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        />

</RelativeLayout>

И простое выражение Glide для загрузки изображения в этот ImageView просто для проверки Glide

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView imageView = (ImageView)findViewById(R.id.image);

        Glide.with(this)
                .load("http://you-ps.ru/uploads/posts/2013-08/1376601606_1273.png")
                .error(R.mipmap.ic_launcher)
                .into(imageView);

    }

Тем не менее, значок ошибки отображается. Что это за проблема? У меня есть прокси-сервер в моей сети и соответствующие gradle.properties для этого случая.

systemProp.http.proxyHost=proxy******.ru
systemProp.http.proxyPort=****

Но даже если я попытаюсь запустить это маленькое приложение без каких-либо прокси, по какой-то причине оно не будет работать.

Мой файл build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.vbusovikov.glidetest"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.1.1'

    compile 'com.github.bumptech.glide:glide:3.7.0'

    testCompile 'junit:junit:4.12'
}

UPD. Это простое приложение может загружать изображения из Интернета, но не может загружать изображения с моего сервера. Некоторые изображения моего сервера загружаются нормально, а другие нет. Я уже потерян с этим

10 ответов

Решение

К сожалению, все ответы были правильными, но не работали в моих условиях. Настройки сервера не подходили для загрузки картинок с него.

== UPDATE ==

Через некоторое время я понял, что картинки на моем сервере были сломаны. Вы можете проверить, является ли ваша фотография по указанному URL-адресу действительной, открыв ее в Mozilla Firefox. Последние несколько килобайт на фотографиях могут быть удалены, но такие браузеры, как Google Chrome, игнорируют это и обычно показывают изображение. Однако Firefox более чувствителен, поэтому помогает локализовать проблему.

Используйте https вместо http в URL вашего изображения.

Я добавляю этот атрибут в манифест

       <application
       ...
        android:usesCleartextTraffic="true"
       ...>
</application>

Возможно, я уже слишком поздно отвечать на него, но если кто-то все еще сталкивается с этой проблемой. Так что я столкнулся с подобной проблемой, когда я не мог загружать изображения с помощью Glide, и после большого исследования я обнаружил, что проблема не в скольжении, а в URL-адресе изображения. Чтобы решить эту проблему, я попытался использовать собственный пользовательский агент, и это сработало для меня.

      GlideUrl url = new GlideUrl(imgUrl, new LazyHeaders.Builder()
                    .addHeader("User-Agent", WebSettings.getDefaultUserAgent(mContext))
                    .build());

и используйте этот URL для загрузки изображения:

      Glide.with(mContext).load(url).into(imageview);

Изображение может быть слишком большим для загрузки, что может вызвать исключение: "Растровое изображение слишком велико для загрузки в текстуру". В этом случае изображение следует масштабировать перед установкой для него View (см . Ответ user1352407)

Скопировано из ответа пользователя1352407:

ImageView iv  = (ImageView)waypointListView.findViewById(R.id.waypoint_picker_photo);
Bitmap d = new BitmapDrawable(ctx.getResources() , w.photo.getAbsolutePath()).getBitmap();
int nh = (int) ( d.getHeight() * (512.0 / d.getWidth()) );
Bitmap scaled = Bitmap.createScaledBitmap(d, 512, nh, true);
iv.setImageBitmap(scaled);

Что ж, это случилось со мной: не отображается на эмуляторе, но отображается на реальном устройстве, поэтому я зашел в настройки -> приложения на эмуляторе, нашел ваше приложение и УДАЛИЛ его, когда вы снова запустите его, он сначала установит его снова и вуаля

Попробуйте также добавить тег-заполнитель (выглядит странно, но это исправило меня на моей стороне)

Glide.with(YourActivity.this)
                .load("http://you-ps.ru/uploads/posts/2013-08/1376601606_1273.png")
                .error(R.mipmap.ic_launcher)
                .placeholder(R.mipmap.placeholder)
                .into(imageView);

В моем случае я использую слушателя, а в onResourceReady я возвращался true, но ты должен вернуться false.

         Glide.with(context)
        .load(url)
        .centerCrop()
        .diskCacheStrategy(DiskCacheStrategy.RESOURCE).listener(object :
            RequestListener<Drawable> {
            override fun onLoadFailed(
                e: GlideException?,
                model: Any?,
                target: Target<Drawable>?,
                isFirstResource: Boolean,
            ): Boolean {
                imageView.visibility = GONE
                errorContainer.visibility = VISIBLE
                return true
            }

            override fun onResourceReady(
                resource: Drawable?,
                model: Any?,
                target: Target<Drawable>?,
                dataSource: DataSource?,
                isFirstResource: Boolean,
            ): Boolean {
                imageView.visibility = VISIBLE
                errorContainer.visibility = GONE
                return false  // <<<<<<<<<<<<<<<<<<<<<<<< here
            }

        }).into(imageView)

Он работает нормально на моей стороне... проверьте сеть и не забудьте добавить разрешение на доступ в интернет в декларации.:)

сотрите данные для устройства, и оно будет работать идеально

Другие вопросы по тегам