我是android新手。我的要求是用选定的联系人图片更新联系人图片。以下是我为实现此目的而编写的代码
byte[] imageBytes = imgContactPhoto.getDrawable().toString().getBytes();
ContentValues values = new ContentValues();
values.put(ContactsContract.Data.RAW_CONTACT_ID, contactId);
values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, imageBytes);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(contactId));
cr.update(uri, values, ContactsContract.Contacts._ID + " = " + contactId, null);
imgContactPhoto是ImageView,在第一行中,我正在提取设置在其上的图像的Bytes数组并更新联系人(使用cotact id = contacts)。
当我调试代码时,它平滑地传递上述所有语句,没有任何异常,但是联系人图片没有更新。当我在新手表的调试期间检查uri和值的值时,
“uri”uri无法解决变量
“值”值无法解析为变量
感谢任何帮助。
答案 0 :(得分:3)
简短的问题是您正在尝试更新Contacts.CONTENT_URI,但照片存储在Data.CONTENT_URI上。
您是否只需要更新联系人的主要照片?如果是这样,它是相当直接的。要获取数据条目的ID,请使用联系人上的PHOTO_ID,因为这将自动引用具有等于1的IS_SUPER_PRIMARY的照片。一旦有了此ID,请不要将RAW_CONTACT_ID添加到ContentValues并将更新语句更改为:
Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
cr.update(dataUri , values, null, null);
如果你可能在一个没有照片的联系人上设置照片,那就会变得有点棘手。因为您需要插入ContactsContract.Data条目,所以您需要确定正确的ContactsContract.RawContact以附加Data条目。如果只有一个很简单,但如果用户有几个同步源,那么联系人可能会有几个RawContacts。在这种情况下,您需要决定要附加哪一个。