我在获取和设置联系人图像作为视图的背景时遇到问题,令人惊讶的是,很少有关于如何执行此操作的示例。我正在尝试构建类似于显示大型联系人照片的“人脉”应用程序的工具。

这就是我现在正在做的:

Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(id));
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri);
Bitmap bm = BitmapFactory.decodeStream(input);
Drawable d = new BitmapDrawable(bm);
button.setBackgroundDrawable(drawable);

此方法有效,但是它使用的URI会获得缩略图,因此即使缩放图片以适合imageView,即使照片很大,图像看起来也很糟糕。我知道另一种获取URI的方法,而URI实际上是一张大照片:
final Uri imageUri = Uri.parse(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.PHOTO_URI)));

但是我还没有设法将其放入imageView,也许上面的代码可以改编为使用第二个uri。如果您知道如何使用第二个uri,或者是否有比通过URI更简单的获取联系人图像的方法,请告诉我。任何信息将表示感谢。

最佳答案

取得URI的好工作。您快到了。首先考虑使用PHOTO_THUMBNAIL_URI而不是PHOTO_URI,因为这可能是您需要的大小。

编辑:仅供参考,从API 11开始可以使用PHOTO_THUMBNAIL_URI。您仍然可以有条件地使用它。

如果要使用外部库,肯定会在使用Android Universal Image Loader,因为从几天前的1.7.1版本开始,它添加了对内容方案的支持,并且在内存方面非常聪明。它还具有很多自定义选项。

编辑:该库已死。请改用Fresco

如果您希望更好地使用最终的捆绑包大小并自己编写代码,

您需要获取并解码该内容的输入流;这应该在后台线程上完成。看看这种纵容方法;您可以使用图像视图和uri对其进行初始化,并在要加载ImageView时启动它。

private class ContactThumbnailTask extends AsyncTask<Void, Void, Bitmap> {

    private WeakReference<ImageView> imageViewWeakReference;
    private Uri uri;
    private String path;
    private Context context;


    public ContactThumbnailTask(ImageView imageView, Uri uri, Context context) {
        this.uri = uri;
        this.imageViewWeakReference = new WeakReference<ImageView>(imageView);
        this.path = (String)imageViewWeakReference.get().getTag(); // to make sure we don't put the wrong image on callback
        this.context = context;
    }

    @Override
    protected Bitmap doInBackground(Void... params) {
        InputStream is = null;
        try {
            is = context.getContentResolver().openInputStream(uri);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        Bitmap image = null;
        if (null!= is)
            image=  BitmapFactory.decodeStream(is);

        return image;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (imageViewWeakReference != null && imageViewWeakReference.get() != null && ((String)imageViewWeakReference.get().getTag()).equals(path) && null != bitmap)
            imageViewWeakReference.get().setImageBitmap(bitmap);
    }
}

08-03 17:47
查看更多