我正在创建一个自动填充字段,按展示名称和电子邮件查询联系人。当有人在过滤后点击所需的联系人时,将该联系人添加到包含其电子邮件的列表中,如果他有任何联系人,则显示名称和图片。
所以到目前为止我已经设法做了所有事情,除了让照片出现。以下是我运行查询以获取电子邮件,显示名称,ID和照片ID的方法。
return mContent.query(Email.CONTENT_URI,
PROJECTION, filter, null, null);
投影是:
PROJECTION = new String[] {ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.PHOTO_ID,
Email.DATA
};
这个做我需要的并返回所有数据。但是我在调试此问题时注意到的一件事是联系人ID与例如针对特定显示名称对ContactsContract.Contacts.CONTENT_URI运行查询的情况不同。
例如我运行的测试通过运行Contacts.CONTENT_URI来获取所有联系人。我给了一个图像联系人,ID为152.但是对Email.CONTENT_URI的查询给了我一个452的id同一联系人(具有相同的显示名称和电子邮件地址)。因此,当我试图获取包含Id 452的内容uri的照片时,它返回该照片不存在,但如果我尝试获取152的照片它完美地工作。
导致此问题的原因是什么?我如何获得正确的用户名?是否有任何关系查询,我可以运行以获取联系人ID,或者可能是在这个问题的帮助下获得它的正确方法。
谢谢。
修改
我发现这是在挖掘旧代码。可能对任何人都有帮助。
完整的查询:
String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID,
ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID,
Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID };
String order = " CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME
+ " NOT LIKE '%@%' THEN 1" + " ELSE 2 END, "
+ ContactsContract.Contacts.DISPLAY_NAME + " COLLATE NOCASE";
String filter = Email.DATA + " NOT LIKE '' ) GROUP BY ( " + Email.DATA;
然后它的
getContentResolver().query( Email.CONTENT_URI, PROJECTION, filter, null, order);
答案 0 :(得分:6)
如果要访问联系人的照片,则需要指定联系人照片URI,例如使用此方法:
public Uri getContactPhotoUri(long contactId) {
Uri photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
photoUri = Uri.withAppendedPath(photoUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
return photoUri;
}
但对于contactId,你必须使用:
String id = ContactsContract.CommonDataKinds.Photo.CONTACT_ID;
long contactId = Long.parseLong(id);
请注意,常见错误是使用ContactsContract.Contacts._ID
代替ContactsContract.CommonDataKinds.Photo.CONTACT_ID
我希望能帮助你。
答案 1 :(得分:1)
您应该在查询中使用RAW_CONTACT_ID。例如,可以有两个不同的联系人,即单个CONTACT_ID的RAW_CONTACT_ID不同。
答案 2 :(得分:1)
也许您可以在示例中查看此博客帖子,他们会查询所有联系人,电子邮件地址和联系人照片 http://blog.app-solut.com/2011/03/working-with-the-contactscontract-to-query-contacts-in-android/
答案 3 :(得分:1)
最佳代码将是
Uri photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Id);
Bitmap photoBitmap;
ContentResolver cr = getContentResolver();
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(cr, photoUri);
photoBitmap = BitmapFactory.decodeStream(is);
适用于所有