简单的方法添加联系人照片到ImageView?

我有问题,并设置联系人的图像作为视图的背景,令人惊讶的是有几个例子如何做到这一点。 我正在尝试构build类似于显示大型联系人照片的“人物”应用的内容。

这就是我现在正在做的事情:

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:

 final Uri imageUri = Uri.parse(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.PHOTO_URI))); 

然而,我没有设法得到它imageView,也许上面的代码可以适应使用第二个uri。 如果你知道如何使用第二个URI,或者如果有一个比通过URI更容易获取联系人图像的方法,请告诉我。 任何信息将被感谢。

Solutions Collecting From Web of "简单的方法添加联系人照片到ImageView?"

在获取URI方面做得不错。 你快到了。 首先考虑使用PHOTO_THUMBNAIL_URI而不是PHOTO_URI,因为它可能是您需要的大小。

编辑:FYI,PHOTO_THUMBNAIL_URI可用于启动API 11.您仍然可以有条件地使用它。

如果你想使用外部库,“ Android通用图像加载器 ”绝对是你要找的东西,从几天前的1.7.1版本开始,它增加了对内容scheme的支持,它非常​​聪明,内存明智的。 它也有很多定制选项。

编辑:这个库已经死了。 改用Fresco 。

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

您需要获取并解码该内容的inputstream; 这应该在后台线程上完成。 看看这个安慰的方法; 你用你的图像视图和你得到的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); } } 

这是build议。 首先知道一件事。

当你设置一个联系人图片。 第一个Android显示该图像的裁剪活动。 喜欢 在这里输入图像说明

****仔细看看上面的图片。 Android将图像裁剪成方形。 将方形图像存储为联系人中的一个Blob(不是单个图像,而是一个blob)。
你从你的编码中得到一个方形的图像。 所以上下只显示黑色。 因为你的手机是长方形的

如果你想显示全屏图像。 请通过编程设置一个大的图像联系。 大量的例子在互联网上。

一切顺利您的尝试。 如果你有任何疑问。 请提供意见。

你可以尝试使用SmartImageView: http : //loopj.com/android-smart-image-view/扩展图像查看,也加载图像asynchronous。

可能这会帮助你(联系由getId()确定):

 /** * @return the photo URI */ public Uri getPhotoUri() { try { Cursor cur = this.ctx.getContentResolver().query( ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.CONTACT_ID + "=" + this.getId() + " AND " + ContactsContract.Data.MIMETYPE + "='" + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'", null, null); if (cur != null) { if (!cur.moveToFirst()) { return null; // no photo } } else { return null; // error in cursor process } } catch (Exception e) { e.printStackTrace(); return null; } Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long .parseLong(getId())); return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); } 

用法是:

 Uri u = objItem.getPhotoUri(); if (u != null) { mPhotoView.setImageURI(u); } else { mPhotoView.setImageResource(R.drawable.ic_contact_picture_2); } 

使用外部库为你做到这一点。 或者浏览代码并按照自己的方式制作一些类似的东西。

下面是我在我自己的几个应用程序上使用的一个: UrlImageViewHelper

代码将如下所示:

 Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(id)); UrlImageViewHelper.setUrlDrawable(button, uri.toString(), R.drawable.dummy_contact_photo); 

您可以使用以下方法轻松地将联系人照片设置为图像视图。

 public String getImageUriString(String phoneNumber) { ContentResolver resolver = context.getContentResolver(); Cursor names = resolver.query( Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)), null, null, null, null); names.moveToFirst(); String name = ""; if(!names.isAfterLast()) { name = names.getString(names.getColumnIndex(ContactsContract.PhoneLookup.PHOTO_URI)); } else { name = null; } names.close(); return name; } public void setImageView(ImageView contactPhoto) { String photoUriString = di.getImageUriString(contactNumber); if(photoUriString != null) { Uri photoUri = Uri.parse(photoUriString); contactPhoto.setImageURI(photoUri); } else { contactPhoto.setImageResource(R.drawable.icon_contact); } } 

从你的类,使用从上述方法获得的URI设置图像视图。

为了能够做到这一点,你只需要添加一个最后一个参数preferHighres = true:

 openContactPhotoInputStream (ContentResolver cr, Uri contactUri, boolean preferHighres) 

如果preferHighres为真,并且联系人有更高分辨率的照片可用,则返回。 如果为false,则此函数总是尝试获取缩略图

  Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(id)); InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(context.getContentResolver(), uri, true); 

所有的图像可能会有不同的大小。 为了调整它们,我使用下面的代码:

  Bitmap bm = BitmapFactory.decodeStream(input); bm = Bitmap.createScaledBitmap(photo, contactImageWidth, contactImageheight, false); Drawable d = new BitmapDrawable(getContext(), bm); button.setBackgroundDrawable(d);