Android 6.0以后的版本報錯:open failed: EACCES (Permission denied)
在開發項目中,遇見要進行文件操作,遇見Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)錯誤 .
此問題共分為三步來解決:
首先來說下聯網和讀寫文件問題:
1.添加權限(注意:6.0后的版本即使添加了權限還是會報錯,但是權限聲明是必須要加的)
AndroidManifest.xml中添加權限:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.添加了聯網權限后還是連不上網,或者聯網拒絕,這里四種解決辦法:
a.APP改用https
b.targetSdkVersion 降到27以下
c.AndroidManifest.xml中的application加入:
<application
android:usesCleartextTraffic="true" //這個是需要加入的內容,可以解決聯網訪問路徑問題 ..... >
d.c中比較復雜的寫法:在res下創建xml文件夾,在xml文件夾中在建立network_security_config.xml文件,內容如下:
network_security_config.xml:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
然后在AndroidManifest.xml的application標簽中加入:
android:networkSecurityConfig="@xml/network_security_config"
3.此時還是會報無法存儲的問題,這里是因為6.0后的權限需要手動申請,我們需要在MainActivity中加入如下的代碼:
private final int REQUEST_EXTERNAL_STORAGE = 1; private String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; public void verifyStoragePermissions(Activity activity) { // Check if we have write permission int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE); } }
然后我們在onCreate方法中引用即可:
verifyStoragePermissions(this);
