2011-09-09 81 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

相關問題