在下面的代码中,我正在尝试获取具有特定电话号码的所有联系人。

但是,看起来我总是会多次获得一些联系人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没有这样的语句。

07-27 19:15