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; } }
三、额外的适配小技巧
- 权限申请前置:调用删除方法前一定要检查权限,比如:
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; }
- 通过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
相关产品推荐
相关产品推荐

