我正在制作一个自动完成字段,通过显示名称和电子邮件查询联系人。当某人在过滤后单击所需的联系人时,该联系人将被添加到包含其电子邮件、显示姓名和图片(如果有)的列表中。
到目前为止,除了让照片出现之外,我已经完成了所有事情。以下是我运行查询来获取电子邮件、显示名称、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 的查询为我提供了同一联系人的 id 452 (使用相同的显示名称和电子邮件地址)。因此,当我尝试获取包含 Id 452 的内容 uri 的照片时,它会返回该照片不存在,但如果我尝试获取 152 的照片,它会完美运行。
是什么导致了这个问题?我如何获得正确的用户 ID?是否有任何我可以运行来获取联系人 ID 的关系查询,或者可能是在这个查询的帮助下获取它的正确方法。
谢谢。
EDIT
我发现这是在挖掘旧代码。可能对任何人都有帮助。
所以完整的查询:
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;
then its
getContentResolver().query( Email.CONTENT_URI, PROJECTION, filter, null, order);