我是安卓新手。我的要求是用所选的照片更新联系人照片。下面是我为实现此目的而编写的代码
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,在第一行中,我提取其上设置的图像的字节数组并更新联系人(使用 cotact id = contacted)。
当我调试代码时,它顺利地通过了上述所有语句,没有任何异常,但联系人图片没有更新。当我在新 watch 中检查uri的值和调试期间的值时,
"uri" uri 无法解析为变量
“values” 值无法解析为变量
感谢任何帮助。
最佳答案
简短的回答是您正在尝试更新 Contacts.CONTENT_URI,但照片存储在 Data.CONTENT_URI 上。
您是否只需要更新联系人的主要照片?如果是这样,那就相当简单了。要获取数据条目的 id,请使用联系人上的 PHOTO_ID,因为这将自动引用 IS_SUPER_PRIMARY 等于 1 的照片。获得此 id 后,请勿将 RAW_CONTACT_ID 添加到 ContentValues 中,并将更新语句更改为:
Uri dataUri = ContentUris.withAppendedId(Data.CONTENT_URI, dataId);
cr.update(dataUri , values, null, null);
如果您可能为还没有照片的联系人设置照片,事情会变得有点棘手。因为您需要插入 ContactsContract.Data 条目,所以您还需要计算正确的 ContactsContract.RawContact 来附加数据条目。如果只有一个,则很简单,但如果用户有几个同步源,则联系人可能有多个 RawContact。在这种情况下,您需要决定附加到哪一个。
关于java - 使用 ContentResolver.Update() 更新 Android 联系人图片时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5241547/