安卓14(小米HyperOS)APP中修改用户头像时,APP闪退的问题(报错 ”Mutation of _data is not allowed.“)

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)

解决方式

解决记录

在我们的应用中,按照如下步骤解决了这个问题。

  1. 在AndroidManifest.xml中新增权限
<!--安卓14 头像相册需要用到-->
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED"
    android:minSdkVersion="34" />
  1. 原来调用地方,将“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的都可以这样设置。

参考了以下文档,实测有效。

扫描二维码关注公众号,回复: 17424698 查看本文章

安卓14更换头像相册使用若干问题包含权限问题以及系统裁剪报错Mutation of _data is not allowed解决并兼容各个版本

猜你喜欢

转载自blog.csdn.net/qq_41140324/article/details/141820435