調用 file.mkdirs() 創建目錄 /sdcard/AllAroundMe/Images,代碼邏輯判斷 !file.exists() 進入創建分支,但後續 file.exists() 仍為 false,目錄未實際創建成功。
WRITE_EXTERNAL_STORAGE,清單文件聲明不足夠。Environment.getExternalStorageDirectory() + "/AllAroundMe/Images" 字符串拼接易出錯,推薦使用 File 構造函數。getExternalFilesDir()。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- Android 10+ 適配 -->
<application android:requestLegacyExternalStorage="true" ... >
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_CODE_STORAGE);
} else {
createDirectory();
}
private void createDirectory() {
// 推薦:使用應用專用外部存儲目錄(無需權限、自動清理、Android 10+ 兼容)
File dir = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "AllAroundMe/Images");
// 或兼容舊版:公共目錄(需權限)
// File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "AllAroundMe/Images");
if (!dir.exists()) {
boolean success = dir.mkdirs();
Log.d("MyTag", "Create dir: " + dir.getAbsolutePath() + " success=" + success);
}
if (dir.exists()) {
Log.d("MyTag", "Dir exists: " + dir.getAbsolutePath());
}
}
| 方式 | 代碼示例 | 優點 | 缺點 |
|---|---|---|---|
| 字符串拼接 | Environment.getExternalStorageDirectory() + "/xxx" | 直觀 | 跨平台分隔符問題、易出錯 |
| File 構造函數 | new File(baseDir, "subdir") | 自動處理分隔符、可讀性好 | 需確保 baseDir 非 null |
| getExternalFilesDir() | getExternalFilesDir(Environment.DIRECTORY_PICTURES) | 無需權限、應用專用、協卸載自動刪除 | 用戶不可直接在相冊看到 |
| getExternalCacheDir() | getExternalCacheDir() | 臨時文件、系統可自動清理 | 非持久化存儲 |
getExternalFilesDir()、MediaStore)。MediaStore.Images.Media.insertImage 或 ContentResolver.insert。AndroidManifest.xml 中 application 標籤添加 android:requestLegacyExternalStorage="true" 可暫時繼續使用舊模式(Android 10 有效,Android 11+ 無效)。
// 檢查存儲狀態
String state = Environment.getExternalStorageState();
Log.d("Storage", "State: " + state); // MEDIA_MOUNTED 表示可讀寫
// 檢查目錄對象
File dir = new File(...);
Log.d("Dir", "exists=" + dir.exists() + " isDir=" + dir.isDirectory() + " canWrite=" + dir.canWrite() + " absPath=" + dir.getAbsolutePath());