我在获取和设置联系人的图像作为视图的背景时遇到了问题,令人惊讶的是,关于如何执行此操作的示例很少。我正在尝试构建类似于显示大型联系人照片的人物应用程序。
这就是我现在正在做的事情:
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,请告诉我。任何信息都将被感谢。
答案 0 :(得分:8)
很好地获取URI。你快到了。首先考虑使用PHOTO_THUMBNAIL_URI而不是PHOTO_URI,因为它可能是你需要的大小。
编辑:FYI,PHOTO_THUMBNAIL_URI从API 11开始可用。您仍然可以有条件地使用它。
如果你想使用一个外部库,'Android Universal Image Loader'绝对是你想要的,从几天前它的1.7.1版本开始,它增加了对内容方案的支持,它是非常聪明,记忆明智。它还有很多自定义选项。
编辑:这个lib已经死了。请改用Fresco。
如果你更喜欢最终的捆绑尺寸并自己编写代码,
您需要获取并解码该内容的输入流;这应该在后台线程上完成。看看这个connivence方法;您使用图像视图和您获得的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);
}
}
答案 1 :(得分:2)
是建议。首先要知道一件事。
设置联系人图片时。第一个Android显示该图像的Cropping活动。喜欢
****仔细看上面的图片。 Android将图像裁剪为方形。并将方形图像存储为联系人中的Blob。(这不是单个图像。它是blob。)
您可以从编码中获得图像视图的方形图像。所以顶部和底部仅显示黑色。因为你的手机是矩形的。****
如果要显示全屏图像。请通过编程方式为联系人设置一个大图像。互联网上有很多例子。
最适合您的尝试。如果你有任何疑问。请提供意见。
答案 2 :(得分:0)
您可以尝试使用SmartImageView:http://loopj.com/android-smart-image-view/扩展imageview并异步加载图像。
答案 3 :(得分:0)
使用外部库为您完成此操作。或者浏览代码并按照自己的方式制作类似的内容。
这是我在自己的几个应用中使用的一个:UrlImageViewHelper
代码如下:
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.valueOf(id));
UrlImageViewHelper.setUrlDrawable(button, uri.toString(), R.drawable.dummy_contact_photo);
答案 4 :(得分:0)
这可能对您有所帮助(联系方式由 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);
}
答案 5 :(得分:0)
您可以使用以下方法轻松地将联系人照片设置为图像视图。
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设置图像视图。
答案 6 :(得分:0)
为了能够做到这一点,你必须添加一个最后一个参数preferHighres = true:
openContactPhotoInputStream (ContentResolver cr, Uri contactUri, boolean preferHighres)
如果 preferHighres 为true且联系人的分辨率较高的照片可用,则会返回该照片。如果为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);