在Android中使用ContactsContract检索电话号码 – function不起作用

我编写了以下函数,以便检索属于ID为“contactID”的联系人的一个电话号码。

检索电话号码的function:

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 resultContacts = new ArrayList(); 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”中的值调用此函数,则为null。 为什么会这样? 哪里不对?

编辑:我曾经将Contacts._ID映射到CommonDataKinds.Phone.CONTACT_ID – 这不起作用。 但是现在我将Contacts.DISPLAY_NAME映射到CommonDataKinds.Phone.DISPLAY_NAME并且它突然工作 – 奇怪,不是吗? 但我更愿意映射ID而不是显示名称。 所以问题仍然是热门话题。 这可能是由于这些表中的ID不同吗? 这不是为什么有查找ID?

要获取第一部分中的联系人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)); 

由于已将投影设置为null,因此您将获得null。 投影基本上是您想要返回的列的列表,例如

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

希望这可以帮助。

你的getContactPhone()代码在我的最后工作正常。 我通过启动联系人选择器,选择联系人,然后使用返回的ID并将其传递到您的方法中进行测试。

所以我怀疑你确实传了一个无效的ID。 你可以发布空指针exception的完整堆栈跟踪吗?

是的,查找密钥可用,因为由于同步和联系人聚合更改了_ID,因此无法保证_ID保持不变。