BUG记录
问题描述
用户在修改头像时,应用程序发生崩溃。
设备信息
设备型号:小米14Pro
Xiaomi HyperOS:1.0.41.0
Android版本:14
代码定位
在“getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)”处发生崩溃。
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.DATA, tempFile.getAbsolutePath());
mCropUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
在Evaluate中执行
Code fragment如下:
mCropUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
计算结果为:
result = {IllegalArgumentException@30327}
Method threw 'java.lang.IllegalArgumentException' exception.
报错详情
报错 ”Mutation of _data is not allowed.“
java.lang.IllegalArgumentException: Mutation of _data is not allowed.
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:172)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:599)
at android.content.ContentResolver.insert(ContentResolver.java:2212)
at android.content.ContentResolver.insert(ContentResolver.java:2173)
解决方式
解决记录
在我们的应用中,按照如下步骤解决了这个问题。
- 在AndroidManifest.xml中新增权限
<!--安卓14 头像相册需要用到-->
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED"
android:minSdkVersion="34" />
- 原来调用地方,将“MediaStore.Images.Media.DATA”改用了“MediaStore.Images.Media.RELATIVE_PATH”。
ContentValues values = new ContentValues();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S){
values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);
Uri externalUri = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
mCropUri = getContentResolver().insert(externalUri, values);
}else {
values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.DATA, tempFile.getAbsolutePath());
mCropUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
注意:Build.VERSION_CODES.S为31的标记,34的标记为“ UPSIDE_DOWN_CAKE ”。这里SDK版本>=31的都可以这样设置。
参考了以下文档,实测有效。
安卓14更换头像相册使用若干问题包含权限问题以及系统裁剪报错Mutation of _data is not allowed解决并兼容各个版本