java - 使用 ContentResolver.Update() 更新 Android 联系人图片时出现问题

标签 java 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,在第一行中,我提取其上设置的图像的字节数组并更新联系人(使用 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/

相关文章:

java - 使用 iText 生成黑白 pdf

java - 使用 SQL DB 的 Java 程序的资源注意事项

java - 将 fragment 列表发送到 FragmentPagerAdapter

java - 在 Java 中绘制矩形显示像素异常

java - 如何在android中检查日期在10天内

android - XML 问题,文本不显示 android

java - 如何将信标名称插入数据库?

java - 匿名类怎么可以有参数呢?

Android - jmdns 没有发现设备

android - 从 FrameLayout 中移除前景 View