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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:25:16