Android 写文件权限问题

265 阅读1分钟

最近在写 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);

排查

在谷歌上一顿搜索,找了几个贴子进去看 image.png 发现有的让在<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创建成功,就可以正常写文件了。

参考博客

blog.51cto.com/u_14523369/…