我們在處理緩存的時候,並不是每次都會在應用私有存儲空間那里保存,很多時候是需要用到ExternalStorage。我們平時一般都是用Environment.getExternalStorageDirectory(),這在6.0以前一直是好的,(即使不對,那你的問題應該是沒注意加權限,或者是格式不對之類又或者sdcard被移走了等等)。但是到了6.0以后,就發現怎么都不無法創建文件了。很多人就疑惑,該加的權限都加了,怎么就沒法創建呢?
原因是Android 6.0以后,google升級了Android的權限管理機制,對於一些敏感的權限,需要顯性申請並被用戶允許才可能運行。
private void checkPermission() { if (Build.VERSION.SDK_INT >= 23) { int write = checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE); int read = checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE); if (write != PackageManager.PERMISSION_GRANTED || read != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 300); } else { String name = "CrashDirectory"; File file1 = new File(Environment.getExternalStorageDirectory(), name); if (file1.mkdirs()) { Log.i("wytings", "permission -------------> " + file1.getAbsolutePath()); } else { Log.i("wytings", "permission -------------fail to make file "); } } } else { Log.i("wytings", "------------- Build.VERSION.SDK_INT < 23 ------------"); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == 300) { Log.i("wytings", "--------------requestCode == 300->" + requestCode + "," + permissions.length + "," + grantResults.length); } else { Log.i("wytings", "--------------requestCode != 300->" + requestCode + "," + permissions + "," + grantResults); } }
備注:附上android的權限組,因為同一組的任何一個權限被授權了,其他權限也自動被授權。例如,一旦WRITE_EXTERNAL_STORAGE被授權了,app也有READ_EXTERNAL_STORAGE.所以,你只申請一個就可以了。
android.permission-group.CALENDAR |
|
android.permission-group.CAMERA |
|
android.permission-group.CONTACTS |
|
android.permission-group.LOCATION |
|
android.permission-group.MICROPHONE |
|
android.permission-group.PHONE |
|
android.permission-group.SENSORS |
|
android.permission-group.SMS |
|
android.permission-group.STORAGE |
|
