Android - 联系人ID不是意图的选定联系人

时间:2015-04-02 15:09:20

标签: android android-intent android-contacts

当用户需要选择联系人时,我称之为:

Intent pickContactIntent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI );
pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
onActivityResult中的

我有以下内容:

Uri pickedContact = intent.getData();
Cursor cursor = getContentResolver().query(pickedContact, null, null, null, null);
   if (cursor.moveToFirst()) {
       contactInfo.name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
       contactInfo.photo = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI));

       Cursor pCur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
                            new String[]{cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))}, null);
}

当DISPLAY_NAME和PHOTO_THUMBNAIL_URI按预期工作时,_ID似乎是一个不同的联系人,因此电话号码光标会检索不相关的电话号码(不同的联系人)。我错过了什么?

1 个答案:

答案 0 :(得分:1)

您指定为Uri的数据的Intent与您设置的mimetype不匹配。

对于您使用的数据Contacts.CONTENT_URI,其中包含mimetype Contacts.CONTENT_TYPE(其值为" vnd.android.cursor.dir / contact")。对于mimetype,您将其设置为CommonDataKinds.Phone.CONTENT_TYPE(其值为" vnd.android.cursor.dir / phone_v2"),它通常与Uri CommonDataKinds.Phone.CONTENT_URI相关联。

发生的事情是你实际上正在选择一部手机,所以你要取回手机的内容Uri而不是联系人。当您提取显示名称和缩略图照片Uri时,这一点并不明显,因为当您查询电话时,这些列无论如何都来自联系人。但是,_ID是针对电话的,而不是联系人。

将您的代码更改为

pickContactIntent.setType(Contacts.CONTENT_TYPE)

...或者只是完全删除对setType()的调用,因为无论如何系统都会解析它。