You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android API 29及以上MediaStore删除后本地存储文件未删除如何解决

根因说明
  • Android 10(API 29)及以上版本启用分区存储机制,禁止应用直接通过FileAPI操作共享存储中的媒体文件,你调用file.delete()实际会返回失败,无法删除本地文件
  • 你的现有代码仅对API 29(Android Q)执行了ContentResolver.delete()操作,API 30及更高版本没有触发这步逻辑,仅系统默认删除了MediaStore记录,不会同步删除源文件
修复方案

你无需手动调用File相关的删除逻辑,只要正确调用ContentResolver.delete()方法,系统会自动同步删除MediaStore记录和对应的本地存储文件,修改后的代码如下:

intentSenderRequest = registerForActivityResult(new ActivityResultContracts.StartIntentSenderForResult(), new ActivityResultCallback<ActivityResult>() {
    @Override
    public void onActivityResult(ActivityResult result) {
        if (result.getResultCode() == Activity.RESULT_OK) {
            // 所有API >=29的版本统一走ContentResolver删除逻辑
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                getActivity().getApplication().getContentResolver().delete(deleteUri, null, null);
            } else {
                // 低于API29的版本继续使用原File删除逻辑
                File file = new File(deleteAudioModel.getData());
                file.delete();
            }
            Toast.makeText(getActivity(), deleteAudioModel.getData(), Toast.LENGTH_SHORT).show();
            adapter.itemDeleted(itemForDelete);
        } else {
            Toast.makeText(getActivity(), "Not Deleted", Toast.LENGTH_SHORT).show();
        }
    }
});
注意事项
  • 保证你传入的deleteUri是MediaStore对应音频条目的原生content://格式Uri,不要使用文件路径转换得到的Uri
  • 废弃MediaStore.Audio.Media.DATA字段的使用,该字段从API 29开始已被标记为过时,后续系统版本可能返回无效值
  • 只要走标准的删除授权流程,不需要申请MANAGE_EXTERNAL_STORAGE这类特殊权限即可完成删除操作

内容的提问来源于stack exchange,提问作者sam m

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 14:09:03