从Android联系人数据库获取联系人ID无法正常工作

时间:2011-09-09 03:18:19

标签: android android-emulator android-contacts

我有以下代码。

        int phoneContactID = new Random().nextInt();

    Cursor contactLookupCursor =  context.getContentResolver().query( Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,Uri.encode(contactNumber)), new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup._ID},null,null,null);     

    try 
    {
        contactLookupCursor.moveToFirst();
        while(contactLookupCursor.moveToNext())
        {
            phoneContactID = contactLookupCursor.getInt(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup._ID));
         }
    } 
    finally 
    {
        contactLookupCursor.close();
    }       

上述代码中的问题是,即使我在模拟器联系人中提供现有数字,也不会返回任何结果。我正在测试它一小时后它工作正常,现在当我再次测试它,它没有返回任何东西。我不确定代码是否有任何问题。我想要做的是获得一个与多个数字相匹配的ID。例如,有一个名为“A”的联系人姓名,A有两个号码。基本上A的联系人ID应该是1,无论我指的是哪个号码。我的假设是否正确?

更新:我做了一些测试。假设一个号码在没有国家代码的情况下存储在联系人数据库中,如222-222-2222。仅当我通过2222222222或222-222-2222时,使用以下代码的搜索才会返回联系人ID。如果存储的号码与12222222222相同,则仅当我搜索号码为12222222222时才会收到有效的联系人ID。

        String[] projection = new String[] {ContactsContract.CommonDataKinds.Phone._ID,ContactsContract.CommonDataKinds.Phone.CONTACT_ID};
    Uri contactUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(contactNumber));
    Cursor c = context.getContentResolver().query(contactUri, projection, null, null, null);
    if (c.moveToFirst()) {
        phoneContactID = c.getInt(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
    }

我不确定我在这里做错了什么。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:19)

public static int getContactIDFromNumber(String contactNumber,Context context)
{
    contactNumber = Uri.encode(contactNumber);
    int phoneContactID = new Random().nextInt();
    Cursor contactLookupCursor = context.getContentResolver().query(Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,contactNumber),new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup._ID}, null, null, null);
        while(contactLookupCursor.moveToNext()){
            phoneContactID = contactLookupCursor.getInt(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup._ID));
            }
        contactLookupCursor.close();

    return phoneContactID;
}

现在正在运行的代码。

答案 1 :(得分:3)

好的。抱歉,我想念解释你的问题 我还没有这样做。但我认为以下代码可能会奏效 试一试,知道:

Cursor phone_cursor = cr.query( 
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                        null,
                        ContactsContract.CommonDataKinds.Phone.NUMBER + " = ?", 
                        new String[]{"YOUR NUMBER GOES HERE"}, null); 
                while (phone_cursor.moveToNext()) 
                { 

//here you can extract the inofrmation you want


phone_cursor.getString(             phone_cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                }

答案 2 :(得分:1)

按照以下方式执行以下步骤:

//此方法将返回一个包含整个信息的游标

private Cursor getContacts()
    {
        // Run query
        Uri uri = ContactsContract.Contacts.CONTENT_URI;
        String[] projection = new String[] {
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,      
        };

        String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER;
        String[] selectionArgs = null;
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

        return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
    }

接下来,您可以遍历此Cursor以获取名称和ID,如下所示:

while (cursor.moveToNext()) 
            {
                namess[i]= cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                id[i] = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                i++;
            }

答案 3 :(得分:0)

vikramjb答案很棒,我尝试以更清晰的方式(通过使用https://developer.android.com/reference/android/provider/ContactsContract.PhoneLookup.html中的说明):

private Long GetContactIdFromNumber(ContentResolver contentResolver, String number)
{
    Uri contactLookup = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
    Cursor contactLookupCursor = contentResolver.query(contactLookup,new String[] {ContactsContract.PhoneLookup._ID}, null, null, null);
    if (contactLookupCursor.moveToNext()){
        long ret = contactLookupCursor.getLong(contactLookupCursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup._ID));
        contactLookupCursor.close();
        return ret;
    }
    contactLookupCursor.close();
    return 0l;
}

BTW,在api版本(21以上)中,PHONE_ACCOUNT_ID中有CallLog.Calls列: https://developer.android.com/reference/android/provider/CallLog.Calls.html