安卓录屏应用创建文件路径报错,无法生成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
相关产品推荐
相关产品推荐

