fix: fresh export URI per save (stale thumbnail), lock spot-meter + quick EV slider, honor photo GPS over device fallback
This commit is contained in:
@@ -60,9 +60,13 @@ function screenSharpenImage(image: SkImage, amount = 0.5): SkImage {
|
||||
return sharpened;
|
||||
}
|
||||
|
||||
// Fixed filename: every export overwrites the previous one, so temp files
|
||||
// never accumulate in the cache directory.
|
||||
const EXPORT_FILE = `${FileSystem.cacheDirectory}camrecipe_pro_last_export.jpg`;
|
||||
// Unique filename per export. A fixed path made every export share one URI, and
|
||||
// RN's <Image> cache (keyed by URI) then kept showing the previous photo in the
|
||||
// thumbnail after a new capture overwrote the file. A fresh URI per export busts
|
||||
// that cache. Previous export file is deleted after the new one is written and
|
||||
// gallery-saved, so at most one stale temp file can ever exist.
|
||||
let lastExportPath: string | null = null;
|
||||
const nextExportFile = () => `${FileSystem.cacheDirectory}camrecipe_pro_export_${Date.now()}.jpg`;
|
||||
|
||||
export async function processAndExportPhoto(
|
||||
sourceUri: string,
|
||||
@@ -299,9 +303,12 @@ export async function processAndExportPhoto(
|
||||
bytes = patchJpegDpi(bytes, options.dpi);
|
||||
}
|
||||
|
||||
// 10. Write binary bytes to temporary local file (overwrites previous export)
|
||||
// 10. Write binary bytes to a unique temporary local file. The unique name
|
||||
// is load-bearing: a fixed URI would be served from RN's <Image> cache and
|
||||
// the thumbnail/preview would keep showing the previous export.
|
||||
const exportFile = nextExportFile();
|
||||
try {
|
||||
new File(EXPORT_FILE).write(bytes);
|
||||
new File(exportFile).write(bytes);
|
||||
} catch (e) {
|
||||
console.error('Failed to write export file: ' + e);
|
||||
return null;
|
||||
@@ -313,8 +320,17 @@ export async function processAndExportPhoto(
|
||||
const mediaPermission = await MediaLibrary.requestPermissionsAsync();
|
||||
if (mediaPermission.granted) {
|
||||
try {
|
||||
await MediaLibrary.saveToLibraryAsync(EXPORT_FILE);
|
||||
return { uri: EXPORT_FILE, savedToLibrary: true };
|
||||
await MediaLibrary.saveToLibraryAsync(exportFile);
|
||||
// New file is safely in the gallery — retire the previous export temp.
|
||||
if (lastExportPath && lastExportPath !== exportFile) {
|
||||
try {
|
||||
await FileSystem.deleteAsync(lastExportPath, { idempotent: true });
|
||||
} catch (e) {
|
||||
console.warn('Cleanup of previous export temp failed:', e);
|
||||
}
|
||||
}
|
||||
lastExportPath = exportFile;
|
||||
return { uri: exportFile, savedToLibrary: true };
|
||||
} catch (e) {
|
||||
console.warn('Save to gallery failed:', e);
|
||||
}
|
||||
@@ -323,7 +339,7 @@ export async function processAndExportPhoto(
|
||||
}
|
||||
console.error(`[export] gallery-save ${Date.now() - t0}ms`);
|
||||
|
||||
return { uri: EXPORT_FILE, savedToLibrary: false };
|
||||
return { uri: exportFile, savedToLibrary: false };
|
||||
} catch (error) {
|
||||
console.error('Error during photo processing and export:', error);
|
||||
return null;
|
||||
|
||||
Reference in New Issue
Block a user