1. 程式人生 > >Android7.0 SDcard無法建立資料夾解決辦法

Android7.0 SDcard無法建立資料夾解決辦法

1. 背景
Android開發過程中,需要在SDcard目錄內建立資料夾並建立檔案儲存內內容,首先在AndroidManifest.xml中加入相關許可權

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
/>

在建立資料夾的地方主需要呼叫mkdir或mkdirs即可建立對應資料夾

File file = new File(dirPath);
if(!file.exists()) {
    file.mkdirs();//多級目錄
}

但是此方法在部分Android7.0手機上無效,執行程式後既無法建立對應的資料夾,程式也不會丟擲異常。
2. 解決方式
直接設定方法
在手機設定->應用管理內找到對應app,在應用許可權列表內,為應用開啟“讀取、寫入或刪除儲存空間”許可權。不同手機可能此許可權設定位置不一樣,但都是可設定的。
程式碼中檢查
檢查對應許可權,若許可權未開啟則彈窗請求許可權(例子中為檢查和請求SDcard寫許可權和相機許可權)

final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
public void checkPermission() {
    if(Build.VERSION.SDK_INT >= 23) {
        List<String> permissionStrs = new ArrayList<>();
        int hasWriteSdcardPermission = 
        ContextCompat.checkSelfPermission(
                WTMainActivity.this
, Manifest.permission.WRITE_EXTERNAL_STORAGE); if(hasWriteSdcardPermission != PackageManager.PERMISSION_GRANTED) { permissionStrs.add( Manifest.permission.WRITE_EXTERNAL_STORAGE ); } int hasCameraPermission = ContextCompat.checkSelfPermission( WTMainActivity.this, Manifest.permission.CAMERA); if(hasCameraPermission != PackageManager.PERMISSION_GRANTED) { permissionStrs.add(Manifest.permission.CAMERA); } String[] stringArray = permissionStrs.toArray(new String[0]); if (permissionStrs.size() > 0) { requestPermissions(stringArray, REQUEST_CODE_ASK_PERMISSIONS); return; } } } //許可權設定後的回撥函式,判斷相應設定,requestPermissions傳入的引數為幾個許可權,則permissions和grantResults為對應許可權和設定結果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch(requestCode) { case REQUEST_CODE_ASK_PERMISSIONS : //可以遍歷每個許可權設定情況 if(grantResults[0]== PackageManager.PERMISSION_GRANTED) { //這裡寫你需要相關許可權的操作 }else{ Toast.makeText(MainActivity.this, "許可權沒有開啟",Toast.LENGTH_SHORT).show(); } } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }