Android 6.0 权限问题引发的报错:
java.io.FileNotFoundException:open failed: EACCES (Permission denied)

今天又踩了一个android的坑,把我整半死,费了老大劲也没完全弄明白怎么回事。

导致问题的主要功能是要读取Download目录下面的一个文本文件,已知条件是

  1. 在AndroidManifest.xml已经请求读写权限
  1. 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)

更多相关文章

  1. Android权限系统(一):开机获取权限信息
  2. Android(安卓)- 判断当前网络环境、隐藏软键盘、动态监测及获取
  3. 安装 apk 到 /system/app 目录下
  4. Android(安卓)O 8.0及其以上系统的通知(Notification)、安装apk
  5. Android学习笔记之文件的保存与读取
  6. Android(安卓)如何让悬浮窗口覆盖显示在导航栏之上?
  7. Android(安卓)6.0 中新的新技术
  8. Android(安卓)6.0 动态权限 java反射
  9. Android权限管理之RxPermission解决Android(安卓)6.0 适配问题

随机推荐

  1. Android获取屏幕宽度高度并动态设置控件
  2. Android事件分发机制(一)
  3. Android(安卓)Service BroadcastReceiver
  4. 最近喜欢上ubuntu,给大家分享一下如何在ub
  5. 2012-06-13 16:50 Android限定EditText的
  6. 如何在一台计算机上安装多个 JDK 版本
  7. 二、Tiny4412开发板运行安卓系统
  8. Android(安卓)Intent原理分析
  9. Android(安卓)对返回按键点击次数的监听
  10. 蓝牙socket读取数据需读多次才读全