2011-09-09 78 views
4

我有以下代码。从Android联系人数据库获取联系人ID未按预期工作

 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有效的接触式ID只收到如果我搜索号码是12222222222.

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

我不知道如果我错在这里做一些事情。任何帮助,将不胜感激。

回答

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

就是现在使用的代码。

+0

伟大的+1为我的身边。真正有用的 – Harshid

+1

一些错误,你有两次编码(contactNumber),在某些情况下,如果你的设备中的电话号码包括国家代码,你的结果为空。 – jjLin

+7

为什么使用“new Random()。nextInt();”?在这种情况下,您应该写入-1或将其更改为可空整数类型。 –

1

在[执行的follwing方式的步骤:

//此方法将返回游标其中将包含所有的消息

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

接下来,您可以通过这个光标迭代,以获取名称和ID具体情况如下:

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

您的代码将帮助我遍历联系人。我想查询给定号码的联系人并提取联系人ID。我不确定这段代码如何帮助我。 – vikramjb

3

Ok..Sorry我想念解释你的问题 我没有做它。但是我觉得follwing代码可能工作 给它一个尝试,还是让我知道:

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

       } 
+0

对不起,延迟回复。我尝试了上面的代码,它无法得到任何结果。但是,无论何时我将输入格式化为与存储在联系人中的方式完全匹配时,它都会为我返回一个ID。例如1-234-567-8900给我的结果,但2345678900没有给我结果。 – vikramjb

+0

谢谢你的努力K-ran-Beast。出于某种原因,我的原始代码开始工作。 – vikramjb

+0

欢迎vikram ...请也发布您的工作片段,如果你自己找到答案....谢谢:-) –

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

顺便说一句,在API版本(21以上)存在CallLog.CallsPHONE_ACCOUNT_ID列: https://developer.android.com/reference/android/provider/CallLog.Calls.html

相关问题