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

安卓录屏应用创建文件路径报错,无法生成Recordings目录如何解决?

错误根因

  • Android 10(API 29)及以上版本默认启用分区存储机制,官方已废弃Environment.getExternalStorageDirectory()的直接访问权限,即便授予读写存储权限也无法在公共存储根目录创建文件夹
  • 当前代码使用mkdir()创建目录,若父目录不存在时会创建失败,稳定性不足
  • 无SD卡的设备如果系统共享存储挂载状态异常,会导致写死的根目录路径无法访问

修复方案

1. 调整Manifest配置

如果你的应用目标SDK版本为29,在AndroidManifest.xml的application节点添加兼容配置:

<application
    ...
    android:requestLegacyExternalStorage="true">
</application>

若目标SDK版本>=30,还需添加特殊存储权限:

<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

该权限需要引导用户跳转至系统设置页面手动开启。

2. 重构路径获取逻辑

推荐优先使用应用专属外部存储目录,无需申请任何存储权限即可读写,适配所有安卓版本:

public String getFilePath() {
    // 优先获取应用专属的视频目录,无需申请存储权限
    File appMovieDir = getExternalFilesDir(Environment.DIRECTORY_MOVIES);
    if (appMovieDir == null) {
        Toast.makeText(this, "Failed to get External Storage", Toast.LENGTH_SHORT).show();
        return null;
    }
    final File recordFolder = new File(appMovieDir, "Recordings");
    boolean createResult = true;
    if (!recordFolder.exists()) {
        // 使用mkdirs替代mkdir,父目录不存在时会自动逐级创建
        createResult = recordFolder.mkdirs();
    }
    if (createResult) {
        String videoName = "capture_" + getCurSysDate() + ".mp4";
        return new File(recordFolder, videoName).getAbsolutePath();
    } else {
        Toast.makeText(this, "Failed to create Recordings directory", Toast.LENGTH_SHORT).show();
        return null;
    }
}

如果需要录屏文件在应用卸载后仍然保留,可使用MediaStoreAPI写入系统公共视频目录,无需申请特殊存储权限即可适配分区存储规则。

3. 补充权限校验逻辑

每次调用录屏功能前,主动校验存储、录音权限是否仍处于授予状态,避免权限被系统回收后触发异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:45:05