Android 设置Uri时出现错误的位图错误
我想让ImageView在网站上显示图像。因此,我创建了一个新的ImageView并执行Android 设置Uri时出现错误的位图错误,android,Android,我想让ImageView在网站上显示图像。因此,我创建了一个新的ImageView并执行imgView.setImageURI(uri) 当我启动应用程序时,图像没有出现,我得到错误,“resolveUri在坏位图Uri(Uri)上失败” 关于如何解决这个问题有什么想法吗?如果它不是一个内容URI,可能会有所帮助。这似乎表明imgView.setImageURI()不应用于常规URI。在相关位中复制: 是的,ImageView.setImageURI(ContentURI)可以工作,但它是针对A
imgView.setImageURI(uri)代码>
当我启动应用程序时,图像没有出现,我得到错误,“resolveUri在坏位图Uri(Uri)上失败”
关于如何解决这个问题有什么想法吗?如果它不是一个内容URI,可能会有所帮助。这似乎表明imgView.setImageURI()
不应用于常规URI。在相关位中复制:
是的,ImageView.setImageURI(ContentURI)
可以工作,但它是针对Android平台特定的内容uri,而不是指定Internet资源的uri。该约定适用于无法通过ContentProvider的游标方法直接公开的二进制对象(例如图像)。相反,字符串引用用于引用不同的内容URI,可以通过对内容提供者的单独查询来解析该URI。setImageURI方法只是为您执行这些步骤的包装器
我已经测试了setImageView
的这种用法,它确实如预期的那样工作。不过,为了便于您使用,我会查看BitmapFactory.decodeStream()
和URL.openStream()
此外,为了使此答案更加完整,请在该链接的另一篇文章中提供示例代码,说明如何执行此操作:
private Bitmap getImageBitmap(String url) {
Bitmap bm = null;
try {
URL aURL = new URL(url);
URLConnection conn = aURL.openConnection();
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
} catch (IOException e) {
Log.e(TAG, "Error getting bitmap", e);
}
return bm;
}
我还没有测试过这段代码,我只是有点偏执,我想确保即使网络上的其他网站都消失了,答案也是有用的:-)你需要下载图像,然后将其设置为位图。
以下是众多示例之一:
首先,您应该下载图像并将其保存在设备(SD卡或内存)
。
然后,获取其文件路径,使用Uri.parse(filePath)
将路径转换为Uri
最后,调用ImageView
的setImageURI(Uri)
以完全填充。
--我用这种方法来达到我的目的,但有一个错误:如果图像太大(可能超过1Mb左右,它可能会报告outOfMemeroy异常!!!)我编写了一个简单的异步任务
,它通过缓存到SD卡将远程HTTPS
转换为本地Uri
:
public class ProfileImageTask extends AsyncTask<String, Void, Uri> {
private boolean enforce = false;
private IProfileImageTask listener;
private String fileName = "photo.jpg";
private String sdPath;
private String url;
/** Constructor */
@RequiresPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
public ProfileImageTask(@NonNull Context context, @NonNull String url, @NonNull IProfileImageTask listener) {
this.sdPath = Environment.getExternalStorageDirectory() + "/" + context.getResources().getString(R.string.app_name) + "/";
this.listener = listener;
this.url = url;
}
@Override
protected void onPreExecute() {
/* setup destination directory */
File directory = new File(this.sdPath + "temp");
if (! directory.exists()) {directory.mkdirs();}
/* setup file name */
String[] parts = this.url.split("/");
this.fileName = parts[parts.length - 1];
}
@Override
protected Uri doInBackground(String... arguments) {
File file = new File(this.sdPath + "temp", this.fileName);
if(file.exists() && this.enforce) {file.delete();}
if (! file.exists()) {
try {
URLConnection conn = new URL(this.url).openConnection();
conn.connect();
InputStream in = conn.getInputStream();
FileOutputStream out = new FileOutputStream(file);
byte[] b = new byte[1024]; int c;
while ((c = in.read(b)) != -1) {out.write(b, 0, c);}
out.close();
in.close();
} catch (IOException e) {
Log.e("ProfileImageTask", e.getMessage());
}
}
return Uri.fromFile(file);
}
@Override
protected void onPostExecute(Uri uri) {
if (listener != null && uri != null) {
this.listener.OnImageAvailable(uri);
}
}
}
以及实施:
@Override
public void OnImageAvailable(@NonNull Uri uri) {
this.photoUrl.setImageURI(uri);
}
使用类似url的https://lh3.googleusercontent.com/.../photo.jpg
(约179kb)。你仍然可以缩小更大的图像,渲染一组缩略图或通过预定的大小。是一个非常棒的图像显示库
Glide.with(context)
.load(uri)
.into(imageView);
使用毕加索图书馆
显示
使用权限android:name=“android.permission.INTERNET”
建立梯度
实现'com.squareup.picasso:picasso:2.71828'
活动:
Picasso.get().load(photoUrl).into(imageView)
Glide.with(context)
.load(uri)
.into(imageView);