Android6.0 createNewFile mkdir mkdirs均失敗的根因
阿新 • • 發佈:2019-01-08
昨天往專案中新增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 intREQUEST_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(); }