如何通过电子邮件地址列表查询联系人

时间:2015-07-14 18:35:30

标签: android contacts

希望从设备中获取联系人。

在源代码中,CONTENT_LOOKUP_URI用于查找一封电子邮件。 如果我有电子邮件列表,并想查询此电子邮件列表中的联系人怎么办?

/**
         * <p>
         * The content:// style URL for looking up data rows by email address. The
         * lookup argument, an email address, should be passed as an additional path segment
         * after this URI.
         * </p>
         * <p>Example:
         * <pre>
         * Uri uri = Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(email));
         * Cursor c = getContentResolver().query(uri,
         *          new String[]{Email.CONTACT_ID, Email.DISPLAY_NAME, Email.DATA},
         *          null, null, null);
         * </pre>
         * </p>
         */
        public static final Uri CONTENT_LOOKUP_URI = Uri.withAppendedPath(CONTENT_URI,
                "lookup");

1 个答案:

答案 0 :(得分:2)

CONTENT_LOOKUP_URI适用于联系人列LOOKUP_KEY,以防联系人_id在sych后发生更改。因此,如果您没有将此密钥存储在某处,则此uri对您没用。使用电子邮件作为密钥可能会或可能不会起作用,具体取决于用作查找键的内容。

如果您确实存储了查找键,那么这应该是您对键列表的查询

List<String> keys;
for(String key : keys){
    Cursor cursor = getContentResolver().query(
        Uri.withAppendedPath(ContactsContract.CommonDataKinds.Email.CONTENT_LOOKUP_URI, "/" + key), 
        null, null, null, null);
}

如果您拥有的只是电子邮件地址,那么最好的方法就是

List<String> emails;
String[] questionMarks = new String[emails.size()];
Arrays.fill(questionMarks,"?");
Cursor cursor = getContentResolver().query(
        ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
        ContactsContract.CommonDataKinds.Email.DATA + " IN (" + TextUtils.join(",", questionMarks) + ")",
        emails.toArray(new String[emails.size()]), null);

在处理电子邮件地址时要小心。像case和dots这样的东西可能很重要,应该考虑(必要时)但是如果你不属于这些情况,那么上面的方法应该可以正常工作。要忽略大小写,只需将COLLATE NOCASE添加到selection参数。