核心代碼
public boolean saveBitmapToFile(Bitmap bitmap, File file) {
try (FileOutputStream fos = new FileOutputStream(file)) {
// PNG 無損,JPEG 品質 90 平衡體積清晰度
return bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
調用示例
File dir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "MyApp");
if (!dir.exists()) dir.mkdirs();
File file = new File(dir, "image_" + System.currentTimeMillis() + ".png");
if (saveBitmapToFile(bitmap, file)) {
// 發送媒體掃描廣播,讓相冊應用立即顯示
MediaScannerConnection.scanFile(context, new String[]{file.getAbsolutePath()}, null, null);
Toast.makeText(context, "Saved to " + file.getAbsolutePath(), Toast.LENGTH_SHORT).show();
}
關鍵點
bitmap.compress(format, quality, stream) 直接編碼寫入流,無需手動轉 byte[]。
- PNG 適合透明/無損,JPEG 適合照片 (quality 80-95)。
- Android 10+ (API 29) 分區存儲:優先用
getExternalFilesDir() 或 MediaStore 插入,無需權限即可讀寫應用專屬目錄。
- 保存後發送
MediaScannerConnection.scanFile 更新媒體庫。