許多開發者直接寫死路徑如 /storage/sdcard0/ 或 /mnt/sdcard/,但在不同裝置、Android 版本、多使用者環境下,這些路徑極不穩定,甚至導致讀寫失敗。
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// SD 卡可用,可讀寫
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// 唯讀
} else {
// 不可用(未插入、格式化中、被 USB 掛載等)
}
File root = Environment.getExternalStorageDirectory(); // 回傳 /storage/emulated/0 等
File myFile = new File(root, "test.txt"); // 安全拼接路徑
File appDir = context.getExternalFilesDir(null); // /storage/emulated/0/Android/data/包名/files
// 寫入
FileOutputStream fos = new FileOutputStream(new File(appDir, "data.txt"));
優點:App 解除安裝時自動清理,不需 WRITE_EXTERNAL_STORAGE 權限(Android 4.4+)。READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE。MediaStore 或 Storage Access Framework。永遠使用 Environment.getExternalStorageDirectory() 或 Context.getExternalFilesDir() 取得路徑,並搭配狀態檢查與權限申請,才能寫出相容性強、不易崩潰的檔案存取代碼。