最近在写 Mediacodec demo 的时候,遇到了一个问题,就是不管怎么添加、申请权限,创建 MediaMuxer 的时候就是会报 FileNotFoundException 异常。
问题
测试代码:
MediaMuxer mMediaMuxer;
try {
mMediaMuxer = new MediaMuxer("/sdcard/test.mp4", MediaMuxer.OutputFormat.MUXER_OUTPUT_MPEG_4);
} catch (IOException e) {
e.printStackTrace();
}
异常:
java.io.FileNotFoundException: /sdcard/test.mp4: open failed: EACCES (Permission denied)
xml 配置:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
请求权限:
String[] permissions = new String[]{
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.MANAGE_EXTERNAL_STORAGE,
};
ActivityCompat.requestPermissions(this, permissions, 1001);
排查
在谷歌上一顿搜索,找了几个贴子进去看
发现有的让在
<application/> 里加上android:requestLegacyExternalStorage="true",试了一下,还是不行。还有的说是要动态申请权限,就是上面requestPermissions的代码,也不好使。最后在51doc的一篇博客上看到了这么几行代码。
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) {
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 1002);
}
结果
添加这个代码后,会进入到一个系统的权限控制页面,是否允许访问所有文件,开启后MediaMuxer创建成功,就可以正常写文件了。