问题描述:
在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),此时系统会弹框让你授权,当用户点击确定后再次删除即可。但是实际上,我发现仅仅这样并没有用,所以还是得借助方案一来实现。