Android存储访问错误 open failed: EACCES (Permission denied)
16lz
2021-01-26
Android 6.0 权限问题引发的报错:
java.io.FileNotFoundException:open failed: EACCES (Permission denied)
今天又踩了一个android的坑,把我整半死,费了老大劲也没完全弄明白怎么回事。
导致问题的主要功能是要读取Download目录下面的一个文本文件,已知条件是
- 在AndroidManifest.xml已经请求读写权限
- Download目录下面文本文件确实存在
String externalStorageDir = Environment.getExternalStorageDirectory().toString();File testfile = new File(externalStorageDir + File.separator + "Download" + File.separator + "test.txt");if(testfile.exists()) } Log.i("FILE", "File exist");}
上述判断执行成功,另外使用手机自带的"文件管理"工具也可以查到到test.txt文件存在,但是下面的读取操作总是抛出异常错误:
InputStreamReader isr = new InputStreamReader(new FileInputStream(testFile));
详细异常如下:
W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Download/test.txt: open failed: EACCES (Permission denied)W/System.err: at libcore.io.IoBridge.open(IoBridge.java:459)W/System.err: at java.io.FileInputStream.(FileInputStream.java:76)...
App的运行环境是华为荣耀,系统更新到Andorid 6.0, API 23
谷歌了一把,大致原因是说:
在Android 6.0版本中,有些权限属于Protected Permission,这类权限只在AndroidManifest.xml中声明是无法真正获取到的,还需要在代码中动态获取,然后再运行时用户在权限许可弹出对话框点击了“允许”后,方可真正获得此权限。
解决办法是,添加如下动态代码:
if (Build.VERSION.SDK_INT >= 23) { int REQUEST_CODE_PERMISSION_STORAGE = 100; String[] permissions = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; for (String str : permissions) { if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) { this.requestPermissions(permissions, REQUEST_CODE_PERMISSION_STORAGE); return; } } }
定义requestPermissions()的回调函数
@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permission, int[] grantResults) { //requestCode就是requestPermissions()的第三个参数 //permission就是requestPermissions()的第二个参数 //grantResults是结果,0调试通过,-1表示拒绝 }
另一种是暴力方法,一般开发自己使用的App时可以使用:
(Android6.0)=>设置=>应用管理=>(你的APP)=>权限=>存储=>打开(On)
更多相关文章
- Android权限系统(一):开机获取权限信息
- Android(安卓)- 判断当前网络环境、隐藏软键盘、动态监测及获取
- 安装 apk 到 /system/app 目录下
- Android(安卓)O 8.0及其以上系统的通知(Notification)、安装apk
- Android学习笔记之文件的保存与读取
- Android(安卓)如何让悬浮窗口覆盖显示在导航栏之上?
- Android(安卓)6.0 中新的新技术
- Android(安卓)6.0 动态权限 java反射
- Android权限管理之RxPermission解决Android(安卓)6.0 适配问题