2012-01-04 34 views
4

我編寫了以下函數以檢索屬於具有ID「contactID」的聯繫人的一個電話號碼。在Android中使用ContactsContract檢索電話號碼 - 功能不起作用

,其功能是檢索電話號碼:

private String getContactPhone(String contactID) { 
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
    String[] projection = null; 
    String where = ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?"; 
    String[] selectionArgs = new String[] { contactID }; 
    String sortOrder = null; 
    Cursor result = managedQuery(uri, projection, where, selectionArgs, sortOrder); 
    if (result.moveToFirst()) { 
     String phone = result.getString(result.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
     if (phone == null) { 
      result.close(); 
      return null; 
     } 
     result.close(); 
     return phone; 
    } 
    result.close(); 
    return null; 
} 

這個函數是怎麼叫:

ArrayList<Contact> resultContacts = new ArrayList<Contact>(); 
Cursor result = null; 
Uri uri = ContactsContract.Data.CONTENT_URI; 
String[] projection = new String[] { 
     ContactsContract.Contacts._ID, 
     ContactsContract.Contacts.DISPLAY_NAME, 
     ContactsContract.CommonDataKinds.Event.CONTACT_ID, 
     ContactsContract.CommonDataKinds.Event.START_DATE, 
}; 
String where = ContactsContract.Data.MIMETYPE+" = ? AND "+ContactsContract.CommonDataKinds.Event.TYPE+" = "+ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY; 
String[] selectionArgs = new String[] {ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE}; 
String sortOrder = null; 
result = managedQuery(uri, projection, where, selectionArgs, sortOrder); 
while (result.moveToNext()) { 
    Long id = result.getLong(result.getColumnIndex(ContactsContract.Contacts._ID)); 
    String phone = getContactPhone(String.valueOf(id)); 
    ... 
} 
... 

不幸的是,這是行不通的。如果我使用從「ContactsContract.Contacts._ID」獲取的值調用此函數,則會得到空值。這是爲什麼?哪裏不對?

編輯:我用來映射Contacts._ID到CommonDataKinds.Phone.CONTACT_ID - 哪個沒有用。但是現在我將Contacts.DISPLAY_NAME映射到CommonDataKinds.Phone.DISPLAY_NAME,它突然生效 - 奇怪,不是嗎?但我更願意映射這些ID而不是顯示名稱。所以這個問題仍然是熱門話題。這可能是由於這些表中的ID不同嗎?這不是爲什麼有查找ID?

+0

您確認只有一位聯繫人嗎? – tidbeck 2012-01-09 23:58:35

+0

是的,因爲我試圖通過第一個查詢的結果光標遍歷每個聯繫人的電話號碼。如果我有兩個聯繫人,這對顯示名稱不起作用,對嗎? – caw 2012-01-10 17:23:07

+0

是否有可能顯示如何獲得'contactId',以便我可以嘗試這個我的自我? – tidbeck 2012-01-10 17:31:00

回答

10

要在第一時間拿到上部的接觸ID,您應該使用:

ContactsContract.Data.CONTACT_ID 

代替:

ContactsContract.Contacts._ID 

所以投影應該是:

String[] projection = new String[] { 
     ContactsContract.Data.CONTACT_ID, 
     ContactsContract.CommonDataKinds.Event.CONTACT_ID, 
     ContactsContract.CommonDataKinds.Event.START_DATE, 
}; 

然後當然得到正確的排:

Long id = result.getLong(result.getColumnIndex(ContactsContract.Data.CONTACT_ID)); 
+0

不,請參閱我在問題中的編輯。但感謝迄今爲止的答案:) – caw 2012-01-09 22:44:57

+0

@MarcoW。如果您在問題中提供了更多詳細信息,我現在已經更新了答案。這對我有效。 – tidbeck 2012-01-11 01:07:11

+0

它的作品,非常感謝你!爲什麼Contacts._ID是錯誤的字段?這個領域是什麼? – caw 2012-01-11 14:08:49

1

因爲您已將投影設置爲空,您將得到空值。投影基本上是您想要返回的列的列表,例如

String[] projection = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.HAS_PHONE_NUMBER}; 

通常情況下,當你發現的接觸,他們可能有電話號碼的列表,所以你必須使用另一個光標通過電話號碼,例如迭代

Cursor phones = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null);  
while (phones.moveToNext()) 
{  
    phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA)); 
} 

希望這會有所幫助。

+0

感謝您的回答!你也可以在你的例子中將投影設置爲null,不是嗎?我認爲當投影爲null時,遊標返回ALL列。這是錯的嗎? – caw 2012-01-07 18:25:32

+1

你說得對。默認情況下,它返回所有列。 – Yury 2012-01-07 18:48:15

+0

是的,你說得對。對不起,我錯過了null。我可以建議的唯一事情是檢查contactID是否有效並通過該方法進行調試。也許首先獲取所有聯繫人,然後檢查是否有與正在傳遞的contactID相關的聯繫人。 – 2012-01-08 18:15:01

1

你的代碼getContactPhone()在我的工作很好。我通過啓動聯繫人選擇器,選擇聯繫人,然後使用返回的ID並將其傳遞到您的方法中進行測試。

所以我懷疑你確實傳入了無效的ID。你能發佈空指針異常的完整堆棧跟蹤嗎?

是的,查找鍵是可用的,因爲_ID不能保持不變,因爲同步和聯繫人聚合會改變它們。

+0

感謝您的回答!沒有空指針異常,managedQuery只是找不到任何行。請看問題中的完整代碼:) – caw 2012-01-10 23:29:49

+1

+1因爲你是對的:)謝謝! – caw 2012-01-11 14:07:22

相關問題