Android录制视频存公共外部存储的可行性及替代方案咨询
公共外部存储录制视频方案的可靠性与替代方案
一、现有方案的长期可靠性
你的方案在后续Android版本中大概率是可靠的,核心依据如下:
- 符合Scoped Storage核心规则:Android官方明确规定,应用自身创建的媒体文件,无论存储在公共目录还是专属目录,应用始终拥有读写权限,这是Scoped Storage的基础规则,后续版本不太可能推翻。
Environment.getExternalStorageDirectory()虽标记为Deprecated,但只是官方引导开发者转向更贴合Scoped Storage的API(如MediaStore),并非彻底禁用。目前API 33+仍可正常使用,且针对应用自创建的文件,系统不会限制访问。- 你通过FileProvider授予系统相机写入权限的方式是合规的,FileProvider是官方推荐的跨应用文件共享机制,长期会保持支持。
小细节优化:系统默认已存在Movies公共目录,代码里的if (!movies.exists() && !movies.mkdir())判断其实多余,可去掉简化逻辑。
二、其他便捷的外部存储录制方案
1. 基于MediaStore的无FileProvider方案
这是官方更推荐的Scoped Storage适配方式,无需手动创建File、配置FileProvider,直接通过MediaStore生成可写入的Uri给系统相机:
private Uri createMediaStoreVideoUri() { ContentValues values = new ContentValues(); String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.getDefault()).format(new Date()); String fileName = "VID_" + timeStamp + ".mp4"; values.put(MediaStore.Video.Media.DISPLAY_NAME, fileName); values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4"); // 指定保存到公共Movies目录 values.put(MediaStore.Video.Media.RELATIVE_PATH, Environment.DIRECTORY_MOVIES); return getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); } // 调用示例 public void dispatchTakeVideoIntent() { Uri videoUri = createMediaStoreVideoUri(); if (videoUri == null) { Log.e(TAG, "无法创建MediaStore Uri"); return; } requestRecordVideoLauncher.launch(videoUri); }
优势:
- 完全符合Scoped Storage规范,无Deprecated API风险
- 无需配置FileProvider,减少代码复杂度
- 视频自动纳入系统媒体库,其他应用可通过MediaStore访问
2. 应用专属外部存储目录
如果不需要视频出现在公共媒体库,可使用应用专属的外部存储目录,无需额外权限,仅需简单配置FileProvider即可:
private File createAppPrivateVideoFile() throws IOException { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.getDefault()).format(new Date()); String fileName = "VID_" + timeStamp + ".mp4"; // 获取应用专属的Movies目录,卸载应用时自动删除 File storageDir = getExternalFilesDir(Environment.DIRECTORY_MOVIES); return new File(storageDir, fileName); }
对应的FileProvider路径配置(paths.xml):
<?xml version="1.0" encoding="utf-8"?> <paths> <external-files-path name="app_movies" path="Movies"/> </paths>
这种方式适合无需视频被其他应用访问的场景,权限处理更简单,文件管理更安全。
内容的提问来源于stack exchange,提问作者user2737037
相关产品推荐
相关产品推荐

