安卓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的都可以这样设置。

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

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EQ-雪梨蛋花汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值