Glide 无法加载图片
Glide cannot load image
我使用 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'
}
更新。这个简单的应用程序可以从互联网加载图片,但不能从我的服务器加载图片。我的服务器的一些图片可以正常加载,但其他图片则不能。我已经迷失了
它在我身边工作正常..检查网络并且不要忘记在清单中添加互联网权限。:)
也尝试添加占位符标签(看起来很奇怪,但这让我站在了一边)
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);
不幸的是,所有答案都是正确的,但不适用于我的条件。服务器设置不适合从中下载图片。
==更新==
后来我发现,我服务器上的图片坏了。您可以通过在 Mozilla Firefox 中打开此 url 来检查提供的 url 中的图片是否有效。
图片中的最后几千字节可能会被删除,但是像 Google Chrome 这样的浏览器会忽略它并正常显示图像。不过Firefox比较敏感,所以有助于定位问题。
==UPDATE2==
又过了一会儿,我发现不仅损坏的图片会导致问题。尝试在应用程序的清单中添加 android:usesCleartextTraffic="true"
。它将解决一些图片加载问题
在图片中使用 https 而不是 http url。
图片可能太大而无法加载,这可能会引发异常:“位图太大而无法上传到纹理中”。在这种情况下,应先缩放图像,然后再将其设置为视图(参见 user1352407's answer)
从 user1352407 的回答中复制:
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);
在我的例子中,我使用的是侦听器,在 onResourceReady 中,我正在 returning true
,但你应该 return 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)
我可能来不及回答了,但如果有人仍然面临这个问题。
所以我遇到了类似的问题,我无法使用 Glide 加载图像,经过大量研究后我发现问题不是来自 glide,而是来自图像 URL。
因此,为了解决这个问题,我尝试使用自定义 User-Agent,它对我有用。
GlideUrl url = new GlideUrl(imgUrl, new LazyHeaders.Builder()
.addHeader("User-Agent", WebSettings.getDefaultUserAgent(mContext))
.build());
并使用此 Url 加载图像:
Glide.with(mContext).load(url).into(imageview);
我将此属性添加到清单
<application
...
android:usesCleartextTraffic="true"
...>
</application>
我使用 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'
}
更新。这个简单的应用程序可以从互联网加载图片,但不能从我的服务器加载图片。我的服务器的一些图片可以正常加载,但其他图片则不能。我已经迷失了
它在我身边工作正常..检查网络并且不要忘记在清单中添加互联网权限。:)
也尝试添加占位符标签(看起来很奇怪,但这让我站在了一边)
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);
不幸的是,所有答案都是正确的,但不适用于我的条件。服务器设置不适合从中下载图片。
==更新==
后来我发现,我服务器上的图片坏了。您可以通过在 Mozilla Firefox 中打开此 url 来检查提供的 url 中的图片是否有效。 图片中的最后几千字节可能会被删除,但是像 Google Chrome 这样的浏览器会忽略它并正常显示图像。不过Firefox比较敏感,所以有助于定位问题。
==UPDATE2==
又过了一会儿,我发现不仅损坏的图片会导致问题。尝试在应用程序的清单中添加 android:usesCleartextTraffic="true"
。它将解决一些图片加载问题
在图片中使用 https 而不是 http url。
图片可能太大而无法加载,这可能会引发异常:“位图太大而无法上传到纹理中”。在这种情况下,应先缩放图像,然后再将其设置为视图(参见 user1352407's answer)
从 user1352407 的回答中复制:
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);
在我的例子中,我使用的是侦听器,在 onResourceReady 中,我正在 returning true
,但你应该 return 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)
我可能来不及回答了,但如果有人仍然面临这个问题。 所以我遇到了类似的问题,我无法使用 Glide 加载图像,经过大量研究后我发现问题不是来自 glide,而是来自图像 URL。 因此,为了解决这个问题,我尝试使用自定义 User-Agent,它对我有用。
GlideUrl url = new GlideUrl(imgUrl, new LazyHeaders.Builder()
.addHeader("User-Agent", WebSettings.getDefaultUserAgent(mContext))
.build());
并使用此 Url 加载图像:
Glide.with(mContext).load(url).into(imageview);
我将此属性添加到清单
<application
...
android:usesCleartextTraffic="true"
...>
</application>