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()
的调用,因为系统无论如何都会解析它。
当用户需要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()
的调用,因为系统无论如何都会解析它。