我想让ImageView在网站上显示图像。所以我创建了一个新的ImageView并执行imgView.setImageURI(uri);
当我启动应用程序时,图像没有出现,我收到错误,“resolveUri在错误的Bitmap Uri(uri)上失败了。”
关于如何解决这个问题的任何想法?
答案 0 :(得分:20)
如果它不是内容URI,this link可能会有所帮助。它似乎表明imgView.setImageURI()
不应该用于常规URI。复制相关位:
是的,
ImageView.setImageURI(ContentURI uri)
有效,但它适用于Android平台特有的内容URI,而不是指定Internet资源的URI。该约定适用于无法通过ContentProvider的Cursor方法直接公开的二进制对象(例如图像)。相反,String引用用于引用不同的内容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;
}
我没有测试过这段代码,我只是偏执,喜欢确保SO答案有用,即使网上的其他每个网站都消失了: - )
答案 1 :(得分:5)
嗯..你需要下载图像,然后将其设置为位图。 这是众多例子中的一个。 http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html
答案 2 :(得分:1)
Glide是一个很棒的用于显示图像的库!
Glide.with(context)
.load(uri)
.into(imageView);
答案 3 :(得分:1)
使用库毕加索
清单
uses-permission android:name =“ android.permission.INTERNET”
构建gradle
实现'com.squareup.picasso:picasso:2.71828'
活动:
Picasso.get()。load(photoUrl).into(imageView);
答案 4 :(得分:0)
首先,您应该下载图片并将其保存在device(sdcard or memory)
中。
然后,使用Uri.parse(filePath)
将路径转换为uri,获取其文件路径
最后,请致电ImageView
的{{1}}填写。
- 我用这种方式来实现我的目的并且有一个错误:如果图像很大(可能超过1Mb左右,它可能会报告outOfMemeroy Exception !!!)
答案 5 :(得分:0)
我写了一个简单的AsyncTask
,它通过缓存到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);
}
}
}
界面:
public interface IProfileImageTask {
void OnImageAvailable(@NonNull Uri uri);
}
执行:
@Override
public void OnImageAvailable(@NonNull Uri uri) {
this.photoUrl.setImageURI(uri);
}
使用类似https://lh3.googleusercontent.com/.../photo.jpg
的网址(大约179kb)进行了测试。仍然可以缩小较大的图像,渲染一组缩略图或通过预期的大小。