我正在尝试显示联系人的列表以及与他们关联的照片,但是我看到大多数没有照片的联系人电话(SG2)默认联系人列表。我认为这是因为其中一些联系人实际上是合并的,并且图片来自列表中未显示的(RAW?)联系人,所以问题是 - 我如何将所有联系人与给定的联系人合并?我尝试使用SQLite,但找不到任何可以唯一标识合并的联系人的列。
从代码的角度来看,我从此方法开始:受保护的位图getImageByContactid(最终上下文AppContext,最终字符串strcontactid) { 位图BMContactimage = null;
Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(strContactId));
Uri photoUri = Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
InputStream image = null;
try {
image = appContext.getContentResolver().openInputStream(photoUri);
bmContactImage = BitmapFactory.decodeStream(image);
try {
image.close();
} catch (IOException e ) {
e.printStackTrace();
}
} catch (FileNotFoundException e1) {
// This can be ignored because the Uri is generic and photo may not really exist
}
return bmContactImage;
}
但这仅返回与与原始搜索条件匹配的"原始"联系人相关的照片(在我的情况下 - 联系人ID) - 如果图片与与原始联系人链接的联系人相关联。
我希望做以下工作,如果我只能获得链接/关联/与原始联系人合并的联系人的(原始?)ID,但是我似乎找不到找到一种方法那些"其他"联系人...
public static Bitmap loadContactPhoto(ContentResolver cr, long id) {
Uri uri = Uri.parse(String.format("content://com.android.contacts/contacts/%s", id));
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
if (input == null) {
return null;
}
return BitmapFactory.decodeStream(input);
}
底线 - 我要做的是显示触点的照片,无论是从与搜索标准匹配的联系人或与该联系人合并的任何联系人的联系 - 任何解决方案都将得到赞赏!
谢谢!
(我从我们的Facebook页面到达这里。)
这是我从内容解析器中获得所有联系人的方式:
public void addContactsMultiple()
{
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
null, null, null, null);
if (cur.getCount() > 0) {
String id="";//Contact ID
String name="";//Contact Name
id = "";
id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if(Integer.parseInt
(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
//Getting the Contact Image
if(cur.getString(cur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)) != null)
{
imagePath = cur
.getString(cur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
}
else {imagePath="none";}//If there is no contact image
}
}
cur.close();
}
在我的代码中,您可以获得图像URI并将其放入联系人对象,而不是使用
ImageView image = (ImageView)findViewById(R.id.image)
image.setImageURI(Uri.parse(imagePath));
或者您可以使用毕加索图像加载程序:毕加索
使用此代码:
Picasso.with(context)
.load(imagePath)
.skipMemoryCache()
.into(image );
如您所见,我不使用位图或解码词。您只需要照片的URI(将图像引导到Android画廊)
如果您从同名的几个联系人获得了几个联系人,则可以使用此代码将其折断:
//(mContactList) is the ArrayList of contacts object I have created)
HashSet<Contact> hs = new HashSet<Contact>();
hs.addAll(mContactList);
mContactList.clear();
mContactList.addAll(hs);
此代码将删除重复
有了一点调整,您可以将图像URI获取到其所属的联系人。
如果您还有更多问题,请回来。