【发布时间】:2011-03-16 21:56:00
【问题描述】:
我正在创建一个自动完成字段,通过显示名称和电子邮件查询联系人。当某人在过滤后单击所需的联系人时,将该联系人与他的电子邮件一起添加到列表中,显示姓名和图片(如果有的话)。
到目前为止,除了让照片出现之外,我已经设法做所有事情。这是我运行查询以获取电子邮件、显示名称、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?是否有任何关系查询我可以运行以获取联系人 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);
【问题讨论】:
标签: android email contacts photo