我需要将联系人的联系人图片作为位图。
我找到了这段代码:
Uri my_contact_Uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(id));
InputStream photo_stream = ContactsContract.Contacts.openContactPhotoInputStream(cr, my_contact_Uri, true);
BufferedInputStream buf = new BufferedInputStream(photo_stream);
Bitmap my_btmp = BitmapFactory.decodeStream(buf);
buf.close();
return my_btmp;
效果很好,但函数openContactPhotoInputStream(cr,my_contact_Uri,true)仅在API 14+上可用。 openContactPhotoInputStream(cr,my_contact_Uri)也适用于早期版本,但没有第3个参数,它似乎只检索缩略图。
在documentation中说:
See Also
if instead of the thumbnail the high-res picture is preferred
但是这个说明背后的链接似乎再次引领当前页面
我可以获得图像的uri,但那又是什么?
答案 0 :(得分:3)
很简单:API 14下面没有高分辨率的联系人图片。 您需要在较低的API上使用低分辨率或将min-sdk设置为14。
它已在API 14中添加,而较低的API将永远不会出现您手动创建的Uri背后的任何内容。
答案 1 :(得分:0)
使用它:
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
int SDK_INT = android.os.Build.VERSION.SDK_INT;
if(SDK_INT>=11){
image_uri=cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
if (image_uri != null) {
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),Uri.parse(image_uri));}
}catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}else{
bitmap=loadContactPhoto(cr, Long.valueOf(id));
if(bitmap!=null)
{
//show bitmap
}
}
}
}
使用过的方法:
public Bitmap loadContactPhoto(ContentResolver cr, long id) {
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
if (input == null) {
return null;
}
return BitmapFactory.decodeStream(input);
}