参考:https://blog.csdn.net/imxiezy/article/details/104929402
背景:在Android api 29的环境下,播放内存中的视频
1.在Manifest文件中添加 静态权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2.在代码中添加动态获取权限的代码,并在Activity函数中调用。
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
"android.permission.READ_EXTERNAL_STORAGE",
"android.permission.WRITE_EXTERNAL_STORAGE" };
public static void verifyStoragePermissions(Activity activity) {
try {
//检测是否有写的权限
int permission = ActivityCompat.checkSelfPermission(activity,
"android.permission.WRITE_EXTERNAL_STORAGE");
if (permission != PackageManager.PERMISSION_GRANTED) {
// 没有写的权限,去申请写的权限,会弹出对话框
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);
System.out.println("here1 ");
}else {
System.out.println("here2 ");
}
} catch (Exception e) {
e.printStackTrace();
}
}
注意,大多数博客就通过上面两个步骤就可以让软件获得读取内存的权限,但是,在SDK 29的情况下,仍被拒绝访问,报错 Log 如下:
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
那么怎么解决呢,查阅了资料发现,需要在Manifest中 application 添加:(这步是非常非常关键的,在SDK大于29+的高版本中)
android:requestLegacyExternalStorage="true"
至此,才能成功获取内存读取权限。
参考官方 issues 连接:https://github.com/google/ExoPlayer/issues/6039