從 SQLite 查詢獲取圖片路徑字符串,BitmapFactory.decodeFile(path) 返回 null;但同樣路徑從文件系統掃描獲取則能正常加載。
數據庫存儲的路徑與實際文件路徑不一致。
業務邏輯:拍照/選圖 → 生成文件名 System.currentTimeMillis() + ".jpg" → 保存文件 → **將文件名存入 SQLite**。
**Bug:存入數據庫的時間戳與實際文件創建時間戳不同步** (如:生成名 → 耗時操作 → 存 DB,中間過了幾毫秒;或多線程並發生成名)。導致 DB 中路徑指向一個**不存在的文件名**。
// 錯誤寫法:多處獨立生成時間戳
String fileName1 = System.currentTimeMillis() + ".jpg"; // 保存文件用
saveImageToFile(bitmap, fileName1);
db.insertImagePath(fileName1); // 存 DB 用另一個時間戳!
// String fileName2 = System.currentTimeMillis() + ".jpg"; // 可能不同!
// 正確寫法:一次生成,全流程共用
String fileName = System.currentTimeMillis() + "_" + UUID.randomUUID().toString().substring(0,8) + ".jpg";
// 1. 保存文件
File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), fileName);
saveImageToFile(bitmap, file.getAbsolutePath());
// 2. 存數據庫 (同一變量)
db.insertImagePath(file.getAbsolutePath()); // 存完整絕對路徑最保險
// 3. 後續查詢 DB 獲取路徑直接 decodeFile,必中
file.getAbsolutePath(),避免相對路徑上下文差異。MediaStore.Images.Media.insertImage 獲取 content:// URI,配合 ContentResolver.openInputStream(uri) 解碼 Bitmap,**徹底避開路徑不匹配、權限、沙箱限制**等問題。BitmapFactory 健壯百倍。adb shell 進入設備,ls -l /path/from/db 確認文件是否存在。SQLite 圖片路徑加載失敗,核心原因是「存入 DB 的路徑與實際文件路徑不一致」,通常因時間戳文件名生成時機不同步。 修復核心:**一次生成文件名/路徑,保存文件與存 DB 共用同一變量**。現代開發**首選 MediaStore URI + 圖片加載庫**,從架構層面消滅路徑管理痛點。