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

Android下无法删除外部存储指定视频文件,附代码求助

解决Android中无法删除外部存储视频文件的问题

我来帮你搞定这个删除视频的麻烦!你遇到的是可移除外部存储(比如SD卡)上的文件删除问题,这类场景结合Android不同版本的存储权限、Scoped Storage机制,确实容易踩坑,咱们一步步来解决。

首先明确你的核心问题:无法删除路径为/storage/6638-3139/DCIM/Camera/20180503_144303.mp4的视频,你尝试用MediaStore的方式写了部分代码但没完成,我给你补全适配多版本的完整方案。

一、先确认权限是否到位

不同Android版本的权限要求不一样,这是基础:

  • Android 6.0(API 23)到Android 9(API 28):必须动态申请WRITE_EXTERNAL_STORAGE权限,只在Manifest里声明没用哦。
  • Android 10(API 29)及以上:Scoped Storage机制下,删除SD卡媒体文件优先用MediaStore API;如果要直接操作所有文件,还需要申请MANAGE_EXTERNAL_STORAGE权限(不过这个权限需要用户去设置里开启)。

二、完整的MediaStore删除实现

你写的代码只开了个头,这里给你补全适配多版本的完整方法,重点处理了可移除存储的Uri问题:

public static boolean deleteVideoFromMediaStore(Context context, File targetFile) {
    if (targetFile == null || !targetFile.exists()) {
        return false;
    }

    String filePath = targetFile.getAbsolutePath();
    ContentResolver contentResolver = context.getContentResolver();
    Uri filesUri;

    // 适配Android 10+的存储卷处理
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
        StorageManager storageManager = context.getSystemService(StorageManager.class);
        StorageVolume storageVolume = storageManager.getStorageVolume(targetFile);
        if (storageVolume == null) {
            return false;
        }
        // 获取对应存储卷的MediaStore Uri
        filesUri = MediaStore.Files.getContentUri(storageVolume.getUuid());
    } else {
        filesUri = MediaStore.Files.getContentUri("external");
    }

    // 构建删除条件
    String whereClause = MediaStore.MediaColumns.DATA + "=?";
    String[] selectionArgs = new String[]{filePath};

    try {
        // 先删除MediaStore中的媒体记录
        int deletedRows = contentResolver.delete(filesUri, whereClause, selectionArgs);
        // 再删除实际的文件(避免MediaStore删除成功但物理文件还存在的情况)
        if (deletedRows > 0 && targetFile.exists()) {
            return targetFile.delete();
        }
        return deletedRows > 0;
    } catch (SecurityException e) {
        e.printStackTrace();
        return false;
    }
}

三、额外的适配小技巧

  1. 权限申请前置:调用删除方法前一定要检查权限,比如:
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1001);
    // 等用户授权后再执行删除逻辑
    return false;
}
  1. 通过Uri精准删除:如果直接用路径匹配失败,可以先查询文件对应的MediaStore Uri,再删除:
private static Uri getFileMediaUri(Context context, File file) {
    String filePath = file.getAbsolutePath();
    Uri filesUri = MediaStore.Files.getContentUri("external");
    String[] projection = {MediaStore.Files.FileColumns._ID};
    String where = MediaStore.MediaColumns.DATA + "=?";
    String[] args = new String[]{filePath};
    
    Cursor cursor = context.getContentResolver().query(filesUri, projection, where, args, null);
    if (cursor != null && cursor.moveToFirst()) {
        long fileId = cursor.getLong(cursor.getColumnIndex(MediaStore.Files.FileColumns._ID));
        cursor.close();
        return ContentUris.withAppendedId(filesUri, fileId);
    }
    return null;
}

然后用这个Uri删除:

Uri fileUri = getFileMediaUri(context, targetFile);
if (fileUri != null) {
    int deleted = context.getContentResolver().delete(fileUri, null, null);
    return deleted > 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:42:31