更新自己的个人资料图片-无法将BLOB转换为字符串

时间:2018-10-20 20:55:45

标签: android profile contactscontract

以下代码大多数运行成功,但在某些设备上崩溃并产生附加错误。有任何想法为什么或我可以做什么来解决这个问题?

代码

byte[] photo = ...; 
long rawId = ...;
Uri currentImageUri = ...; // retrieved via ContactsContract.Profile.PHOTO_URI
ContentValues values = new ContentValues();
values.put(ContactsContract.Data.RAW_CONTACT_ID, rawId);
values.put(ContactsContract.Data.IS_SUPER_PRIMARY, 1);
values.put(ContactsContract.CommonDataKinds.Photo.PHOTO, photo);
values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE);

if (currentImageUri != null) {
    // this crashes sometimes, very rarely though
    context.getContentResolver().update(
        Uri.withAppendedPath(ContactsContract.Profile.CONTENT_URI, ContactsContract.Contacts.Data.CONTENT_DIRECTORY),
        values,
        ContactsContract.Data.RAW_CONTACT_ID + " = " + rawId + " and " + ContactsContract.Data.IS_SUPER_PRIMARY + " = 1",
        null);
} else {
    // we need an insert here, this always works without problems
}

例外

android.database.sqlite.SQLiteException: unknown error (code 0): Unable to convert BLOB to string
#################################################################
Error Code : 0 (SQLITE_OK)
Caused By : unknown error (code 0): Unable to convert BLOB to string
#################################################################
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:179)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
    at android.content.ContentProviderProxy.update(ContentProviderNative.java:572)
    at android.content.ContentResolver.update(ContentResolver.java:1678)
    ... <MY CODE ABOCE - ContentResolver.update line>

1 个答案:

答案 0 :(得分:2)

您的更新选择说:“更新用户配置文件uri中所有RAW_CONTACT_ID等于X并且IS_SUPER_PRIMARY的数据行为真”。

这意味着您基本上将覆盖该个人资料的Data表中的所有电话,电子邮件,组织,地址等行,并使其全部具有指定照片字节[]的Photo行。

您需要首先弄清楚个人资料中是否已包含照片,如果是,则更新该特定照片行。如果其中不包含照片,则需要插入操作(而不是更新)。

在此处查看我的相关答案:https://stackoverflow.com/a/47660583/819355 只需修改代码即可更新个人资料uri,而不是联系人uri。