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

10 篇文章 0 订阅

问题描述:

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要按类型查找Android文件管理,可以使用MediaStore类。MediaStoreAndroid提供的一个媒体库,可以管理设备上的音频、视频、图片和其他文件。可以通过它来查询特定类型的文件,例如图片或音频文件。以下是一个示例代码: ``` Uri uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; String[] projection = {MediaStore.Images.Media.DATA}; String selection = MediaStore.Images.Media.MIME_TYPE + "=?"; String[] selectionArgs = {"image/jpeg"}; String sortOrder = MediaStore.Images.Media.DATE_ADDED + " DESC"; Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder); if (cursor != null) { while (cursor.moveToNext()) { String filePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)); // Do whatever you want with filePath } cursor.close(); } ``` 在这个例子中,我们使用MediaStore.Images.Media.EXTERNAL_CONTENT_URI获取所有外部存储设备上的图片。然后,我们将投影设置为仅包含MediaStore.Images.Media.DATA列,这是图像文件的路径。我们使用MediaStore.Images.Media.MIME_TYPE条件过滤结果,以仅返回JPEG图像。最后,我们使用MediaStore.Images.Media.DATE_ADDED对结果进行排序,以便最新的图像出现在顶部。当查询完成后,我们可以遍历游标并处理每个图像的路径。 这只是一个简单的示例,你可以根据你的需求进行修改。同样的方法也适用于其他类型的文件,如音频文件或视频文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值