【问题标题】:Getting Contact ID from Android Contacts database is not working as intended从 Android 联系人数据库获取联系人 ID 未按预期工作
【发布时间】: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));
    }

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

【问题讨论】:

    标签: android android-emulator android-contacts


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多