Android - contact id 不是出于意图选择的联系人

Android - contact id is not the selected contact out of the intent

当用户需要select一个联系人时,我称之为意图:

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 似乎属于不同的联系人,因此 phone 号码游标检索到不相关的 phone 号码(不同的联系人)。我错过了什么?

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

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

相关联

实际情况是您实际上选择了 Phone,因此您返回的是 Phone 的内容 URI 而不是联系人。当您提取显示名称和缩略图照片 Uri 时,这并不明显,因为当您查询 Phone 时,这些列无论如何都来自联系人。但是,_ID 是 Phone 的,而不是联系人的。

将您的代码更改为

pickContactIntent.setType(Contacts.CONTENT_TYPE)

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