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

Android 如何通过电子邮件地址列表查询联系人,android,contacts,Android,Contacts,希望从设备获取联系人 在源代码中,内容查找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 a

希望从设备获取联系人

在源代码中,内容查找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");
/**
*
*按电子邮件地址查找数据行的content://样式URL。这个
*查找参数(电子邮件地址)应作为附加路径段传递
*在这个URI之后。
*

*示例: * *Uri=Uri.withAppendedPath(Email.CONTENT\u LOOKUP\u Uri,Uri.encode(Email)); *游标c=getContentResolver().query(uri, *新字符串[]{Email.CONTACT_ID,Email.DISPLAY_NAME,Email.DATA}, *空,空,空); * *

*/ 公共静态最终Uri内容\u查找\u Uri=Uri.withAppendedPath(内容\u Uri, “查阅”);
在sych之后,如果联系人的
\u id发生变化,则使用“联系人”列。因此,如果您没有将此密钥存储在某个位置,则此uri对您没有任何用处。电子邮件作为密钥的使用可能有效,也可能无效,这取决于用作查找密钥的内容

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

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);
列表键;
用于(字符串键:键){
Cursor Cursor=getContentResolver().query(
Uri.withAppendedPath(ContactsContract.CommonDataTypes.Email.CONTENT\u LOOKUP\u Uri,“/”+键),
空,空,空,空);
}
如果你只有电子邮件地址,那么最好的方法就是

列出电子邮件;
字符串[]问号=新字符串[emails.size()];
数组。填充(问号“?”;
Cursor Cursor=getContentResolver().query(
ContactsContract.CommonDataTypes.Email.CONTENT\u URI,空,
“+TextUtils.join”(“,”,问号)+”)中的ContactsContract.CommonDataTypes.Email.DATA+”,
emails.toArray(新字符串[emails.size()],null);

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

谢谢,您的答案指向一些解决方案。但是,如果避免在循环内执行单个查询,则更好,也许“IN”是解决方案?@lannyf IN是解决方案。我错误地认为您需要单独查询
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);