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
相关产品推荐
相关产品推荐

