Android 6.0 權限問題引發(fā)的報錯:
java.io.FileNotFoundException:open failed: EACCES (Permission denied)
今天又踩了一個android的坑畴栖,把我整半死字逗,費了老大勁也沒完全弄明白怎么回事。
導致問題的主要功能是要讀取Download目錄下面的一個文本文件,已知條件是
- 在AndroidManifest.xml已經(jīng)請求讀寫權限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- 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");
}
上述判斷執(zhí)行成功步绸,另外使用手機自帶的"文件管理"工具也可以查到到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.<init>(FileInputStream.java:76)
...
App的運行環(huán)境是華為榮耀,系統(tǒng)更新到Andorid 6.0, API 23
谷歌了一把,大致原因是說:
在Android 6.0版本中候醒,有些權限屬于Protected Permission,這類權限只在AndroidManifest.xml中聲明是無法真正獲取到的杂瘸,還需要在代碼中動態(tài)獲取倒淫,然后再運行時用戶在權限許可彈出對話框點擊了“允許”后,方可真正獲得此權限败玉。
解決辦法是敌土,添加如下動態(tài)代碼:
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()的回調(diào)函數(shù)
@Override
public void onRequestPermissionsResult(int requestCode,
String[] permission,
int[] grantResults) {
//requestCode就是requestPermissions()的第三個參數(shù)
//permission就是requestPermissions()的第二個參數(shù)
//grantResults是結果镜硕,0調(diào)試通過,-1表示拒絕
}
另一種是暴力方法返干,一般開發(fā)自己使用的App時可以使用:
(Android6.0)=>設置=>應用管理=>(你的APP)=>權限=>存儲=>打開(On)