在下面的代码中,我正在尝试获取具有特定电话号码的所有联系人。
但是,看起来我总是会多次获得一些联系人ID。
具体来说,我有2个具有相同电话号码的联系人,而我得到了3个联系人ID。其中两次(相同的ID)
有任何想法吗?
谢谢
Cursor contactLookupCursor =
localContentResolver.query(
Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(requestedPhone)),
new String[] {PhoneLookup._ID},
null,
null,
null);
if (contactLookupCursor != null)
{
System.out.println("contactLookupCursor.getCount = "+contactLookupCursor.getCount()); // here i get 3
if(contactLookupCursor.moveToFirst())
{
do
{
int ColumnIndex = contactLookupCursor.getColumnIndex(PhoneLookup._ID);
if(ColumnIndex >= 0)
{
String contactId = contactLookupCursor.getString(ColumnIndex);
System.out.println("contactId="+contactId);// here i get 12 then 13 then 13 again
}
}
while (contactLookupCursor.moveToNext());
}
contactLookupCursor.close();
}
最佳答案
如果您向PhoneLookup.CONTENT_FILTER_URI提供了非标准化的电话号码,那么它将在电话号码的数据记录表中的两个位置匹配。
1 match for number with column "number" in record.
1 match for normalized_number with column "normalized_number" in record.
如果提供
number = "+49177123456"
,则number == normalized_number。在这种情况下,PhoneLookup.CONTENT_FILTER_URI将仅在电话表的“ normalized_number”列中进行搜索。
您也可以使用CommonDataKinds.Phone代替PhoneLookup。
这样,无论提供的电话号码是否已标准化,您都不会得到重复的结果:
String number = "0177123456";
Uri uri = Uri.withAppendedPath(android.provider.ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI,Uri.encode(number));
Cursor rcursor = getContentResolver().query(uri,
new String[] { ContactsContract.CommonDataKinds.Phone.CONTACT_ID },
null,null,null);
我猜想PhoneLookup的奇怪行为是一个错误。
但也许PhoneLookup比CommonDataKinds.Phone更具性能:
类概述:[...]此查询已高度优化。 http://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html
CommonDataKinds.Phone没有这样的语句。