1. 程式人生 > >Android6.0 createNewFile mkdir mkdirs均失敗的根因

Android6.0 createNewFile mkdir mkdirs均失敗的根因

昨天往專案中新增Android自定義異常捕獲的工具類時(參考Android自定義捕獲Application全域性異常)碰到一件很詭異的事情,createNewFile一直報no such file or directory,往前追發現是mkdir失敗了(mkdirs也一樣fail),網上搜了很多都說是AndroidManifest.xml中沒有配置讀寫sd卡的許可權(實際上我已經配置了),最後才定位到是androidM版本的執行時許可權問題,android6.0的執行時許可權涉及以下9組:

身體感測器

日曆

攝像頭

通訊錄

地理位置

麥克風

電話

簡訊

儲存空間

可以參考Android6.0執行時許可權解決方案

最後的解決方案是在程式碼中動態的申請SD卡的讀寫許可權,可以參考Android6.0動態申請SD卡讀寫的許可權

附上我最後解決問題的關鍵程式碼段:

AndroidManifest中新增SD卡讀寫的許可權

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

動態申請許可權

private static final int 
REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = {         "android.permission.READ_EXTERNAL_STORAGE",         "android.permission.WRITE_EXTERNAL_STORAGE" }; public static void verifyStoragePermissions(Activity activity) {     try {         //檢測是否有寫的許可權         int permission = ActivityCompat.checkSelfPermission(activity
,                 "android.permission.WRITE_EXTERNAL_STORAGE");         if (permission != PackageManager.PERMISSION_GRANTED) {             // 沒有寫的許可權,去申請寫的許可權,會彈出對話方塊             ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE,REQUEST_EXTERNAL_STORAGE);         }     } catch (Exception e) {         e.printStackTrace();     } } verifyStoragePermissions方法放在onCreate方法中即可。
if (Environment.getExternalStorageState().equals(
        Environment.MEDIA_MOUNTED)) {
    String path = Environment.getExternalStorageDirectory()+ File.separator+"AndoridCrashlog"+File.separator;
File dir = new File(path);
    if (!dir.exists()) {
        dir.mkdirs();
}
    File file = new File(path, fileName);
Log.d(TAG, "CrashLogPath:" + file.getAbsolutePath()+fileName);
    if (!file.exists()) {
        file.createNewFile();
}
    FileOutputStream fos = new FileOutputStream(file, true);
fos.write(sb.toString().getBytes());
fos.close();
}