同樣代碼 File.mkdirs() 部分手機成功,部分失敗。獲取路徑用 Environment.getExternalStorageDirectory()。
WRITE_EXTERNAL_STORAGE 必須運行時請求用戶授權,清單文件聲明不夠。Environment.getExternalStorageState() == MEDIA_MOUNTED。// 1. 清單聲明
// 2. 運行時請求 (Activity/Fragment)
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
}
// 3. 回調中創建目錄
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
createDir();
}
}
Context.getExternalFilesDir(null) 獲取應用專屬目錄(無需權限,應用卸載自動清理)。Storage Access Framework (ACTION_OPEN_DOCUMENT_TREE) 讓用戶選擇目錄。