从 Android 联系人数据库获取联系人 ID 未按预期工作

Posted

技术标签:

【中文标题】从 Android 联系人数据库获取联系人 ID 未按预期工作【英文标题】:Getting Contact ID from Android Contacts database is not working as intended 【发布时间】:2011-11-13 11:34:27 【问题描述】:

我有以下代码。

        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));
    

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

【问题讨论】:

【参考方案1】:
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。真的很有帮助 一些错误,你有两次 encode(contactNumber),在某些情况下,如果你设备中的电话号码包含国家代码,你的结果是 null。 为什么使用“new Random().nextInt();”?在这种情况下,您应该写 -1 或将其更改为可为空的 Integer 类型。【参考方案2】:

好的..对不起,我错过了解释你的问题 我没有这样做。但我认为以下代码可能有效 试一试,让我知道:

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));

                

【讨论】:

抱歉回复延迟。我尝试了上面的代码,但无法返回任何结果。但是,每当我格式化输入以完全匹配它在联系人中的存储方式时,它都会为我返回一个 id。例如 1-234-567-8900 给了我结果,但 2345678900 没有给我结果。 感谢 K-ran-Beast 的努力。出于某种原因,我的原始代码开始工作。 欢迎 vikram...如果您自己找到答案,也请发布您的工作 sn-ps....谢谢 :-)【参考方案3】:

按以下方式执行步骤:

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

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++;
            

【讨论】:

您的代码将帮助我遍历联系人。我想查询给定号码的联系人并提取联系人 ID。我不确定这段代码对我有什么帮助。【参考方案4】:

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;

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

【讨论】:

以上是关于从 Android 联系人数据库获取联系人 ID 未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

如何从android中的单个查询中获取联系人的名字,姓氏,电子邮件ID

从android中的指定组获取联系人

从 Android 中的 URI 检索联系人电话号码

获取 Android 手机联系人的跨设备唯一 ID

android开发怎样获取通讯录联系人信息

如何在 Android 中获取联系人的所有详细信息