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

时间:2010-09-10 01:19:12

标签: android

我想让ImageView在网站上显示图像。所以我创建了一个新的ImageView并执行imgView.setImageURI(uri);

当我启动应用程序时,图像没有出现,我收到错误,“resolveUri在错误的Bitmap Uri(uri)上失败了。”

关于如何解决这个问题的任何想法?

6 个答案:

答案 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)进行了测试。仍然可以缩小较大的图像,渲染一组缩略图或通过预期的大小。