Android 设置Uri时出现错误的位图错误

Android 设置Uri时出现错误的位图错误,android,Android,我想让ImageView在网站上显示图像。因此,我创建了一个新的ImageView并执行imgView.setImageURI(uri) 当我启动应用程序时,图像没有出现,我得到错误,“resolveUri在坏位图Uri(Uri)上失败” 关于如何解决这个问题有什么想法吗?如果它不是一个内容URI,可能会有所帮助。这似乎表明imgView.setImageURI()不应用于常规URI。在相关位中复制: 是的,ImageView.setImageURI(ContentURI)可以工作,但它是针对A

我想让ImageView在网站上显示图像。因此,我创建了一个新的ImageView并执行
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);