问题描述
当我需要从ANDROID_CONTACTS获取所选号码的联系人姓名时,我有一个要求。
我可以使用->
来获取特定号码的名称Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,Uri.encode(phoneNumber));
Cursor cursor = cr.query(uri,new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME},null,null);
if (cursor == null) {
return;
}
如何传递数字列表并获得它们各自的名称?
解决方法
这是幼稚的方法:
String[] phones = new String[] { "(212) 555-1111","(212) 555-2222","(212) 555-3333"};
String selection = Phone.NUMBER + "IN (?,?,?)";
String[] selectionArgs = phones;
String[] projection = new String[] { Phone.NUMBER,Phone.CONTACT_ID,Phone.DISPLAY_NAME };
Cursor cur = getContentResolver().query(Phone.CONTENT_URI,projection,selection,selectionArgs,null);
DatabaseUtils.dumpCursor(cur); // dumps the cursor to logcat
但是,仅当您输入的电话号码与存储在ContactsContract DB中NUMBER
下的电话号码完全相同的格式时,这才有效。
关于您使用的PhoneLookup.CONTENT_FILTER_URI
API的好处是数字的格式无关紧要,它将以您使用的任何格式在数据库中找到它。
要复制类似内容,您可以尝试使用另一个名为NORMALIZED_NUMBER
的字段,该字段应始终以称为E164的特定格式保存数字。
因此,您可以运行如下查询:
String[] e164_phones = new String[] { "+12125551111","+12125552222","+12125553333"};
String selection = Phone.NUMBER + "IN (?,?)";
String[] selectionArgs = e164_phones; // all phones here must be in e164 format
String[] projection = new String[] { Phone.NUMBER,null);
为此代码,您可能需要一种将电话号码转换为E164格式的方法,请查看this answer then。