我正在创建一个自动填充字段,通过显示名称和电子邮件查询联系人.当有人在过滤后点击所需的联系人时,将该联系人添加到带有他的电子邮件的列表中,显示名称和图片(如果他有).
所以到目前为止我已经设法做了所有事情,除了让照片出现.以下是我如何运行查询以获取电子邮件,显示名称,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运行查询时的联系ID不同.
例如我运行的测试我通过运行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);
解决方法:
如果要访问联系人的照片,则需要指定联系人照片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
我希望能帮助你.