1. 程式人生 > >Android6.0 無法在SD卡建立目錄

Android6.0 無法在SD卡建立目錄

摘要

今天開發中遇到一個問題,專案無法在Android6.0裝置的SD卡建立目錄,在Android6.0以下的移動裝置測試了5.0 、4.3的裝置,均正常,但是在Android6.0卻不正常。

經過排查,執行下列程式碼無法在6.0的裝置上面建立目錄

File dir = new File(DbConfig.BASE_PATH);
if (!dir.exists()) {
   dir.mkdirs();
}

衍生知識

2015年5月29日中Google I/O開發者大會,Google 釋出了 Android M,並命名為“棉花糖”(Marshmallow),對於開發者來說, Android 6.0(API 23)給開發者帶來的一些變化。

這裡寫圖片描述

許可權管理是 Android M 最大的改變,

變化描述:

許可權管理更加精細,並且由以前的安裝時靜態授權,改為現在的執行時動態授權。

大家對 Android 的許可權吐槽已久,Android 應該能極大的改善這方面的問題。主要改變有:

系統設定中可以對 APP 各個許可權單獨控制權限根據內容進行分組了

普通許可權還是在安裝時授權,其他許可權在執行時系統彈窗授權,並且要解析使用這個許可權的目的

對於開發者來說,需要小心處理許可權相關的問題。在使用某個功能的時候,需要總是判斷是否有改許可權,並且通過合適的方式請求使用者授權。

現在描述一下處理的解決方案

1 發起讀寫裝置儲存空間的許可權

ActivityCompat.requestPermissions(AppStartActivity.this,new String[]{ android.Manifest.permission.WRITE_EXTERNAL_STORAGE},1);

2 寫許可權請求回掉函式

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
   boolean writeAccepted = false;
   switch (requestCode) {
      case
1: writeAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED; break; } }

3 執行建立目錄程式碼

if (writeAccepted) {
      String state = Environment.getExternalStorageState();
      if (Environment.MEDIA_MOUNTED.equals(state)) {
         File dir = new File(DbConfig.BASE_PATH);
         if (!dir.exists()) {
            dir.mkdirs();
         }
      }
 }