Android 如何通过电子邮件地址列表查询联系人
希望从设备获取联系人 在源代码中,内容查找URI用于查找一封电子邮件。 如果我有一个电子邮件列表,并且想查询此电子邮件列表中的联系人,该怎么办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
/**
* <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);