更新自己的个人资料图片 - 无法将 BLOB 转换为字符串
Updating own profile image - Unable to convert BLOB to string
以下代码大部分运行成功,但在某些设备上它会崩溃并产生附加错误。有什么想法可以解决这个问题吗?
代码
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>
您的更新选择说:"update all data rows in the user's profile uri that have RAW_CONTACT_ID
equals X and IS_SUPER_PRIMARY
is true"。
这意味着您基本上覆盖了该个人资料 Data
table 中的所有 phone、电子邮件、组织、地址等行,使它们全部 Photo
具有指定照片字节的行[].
您需要先确定个人资料是否已包含照片,如果是,请更新该特定照片行。如果它不包含照片,则需要插入操作(而不是更新)。
在这里查看我的相关答案:
只需修改代码即可更新个人资料 uri 而不是联系人 uri。
以下代码大部分运行成功,但在某些设备上它会崩溃并产生附加错误。有什么想法可以解决这个问题吗?
代码
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>
您的更新选择说:"update all data rows in the user's profile uri that have RAW_CONTACT_ID
equals X and IS_SUPER_PRIMARY
is true"。
这意味着您基本上覆盖了该个人资料 Data
table 中的所有 phone、电子邮件、组织、地址等行,使它们全部 Photo
具有指定照片字节的行[].
您需要先确定个人资料是否已包含照片,如果是,请更新该特定照片行。如果它不包含照片,则需要插入操作(而不是更新)。
在这里查看我的相关答案: