记一次Android Q使用MediaStore删除文件失败的过程

问题描述:

在Android Q上使用MediaStore创建了一个音频文件test1.mp3保存到sdcard/Music/flycat目录下(保存过程省略...)。然后用MediaStore去查询该音频文件的Uri,记为uri1。最后删除:context.getContentResolver.delete(uri1,null,null),此时删除成功

假设我同上步骤创建了test1.mp3,然后再将app卸载,再重新安装该app,此时仍然能查询到该音频的Uri 记为uri1,再用上述方式去删除该文件,此时删除失败

原因:

开了沙箱之后,之前的媒体库生成的文件在其记录上会打上owner_package的标志,标记这条记录是你的app生成的。当你的app卸载后,MediaStore就会将之前的记录去除owner_package标志,也就是说app卸载后你之前创建的那个文件与你的app无关了(不能证明是你的app创建的)。所以当你再次安装app去操作之前的文件时,媒体库会认为这条数据不是你这个新app生成的,所以无权删除或更改。

解决方案:

方案一:

将你的app设为兼容模式:在AndroidManifest.xml的Application中配置android:requestLegacyExternalStorage="true",亲测可行。

方案二:

其实你delete的时候会抛异常,捕获这个异常,如果异常类型为RecoverableSecurityException的话,则可以在Activity或Fragement中调用startIntentSenderForResult(e.getUserAction().getActionIntent().getIntentSender(),请求码,null,0,0,0),此时系统会弹框让你授权,当用户点击确定后再次删除即可。但是实际上,我发现仅仅这样并没有用,所以还是得借助方案一来实现。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值