Fix Android image share workflow and add local plugin persistence
- Add SafeArea and SharedImage plugins to capacitor.plugins.json - Create restore-local-plugins.js to persist plugins after cap sync - Integrate plugin restoration into build scripts - Improve Android share intent timing with retry logic - Clean up debug logging while keeping essential error handling - Add documentation for local plugin management Fixes issue where SharedImage plugin wasn't recognized, causing "UNIMPLEMENTED" errors. Image sharing now works correctly on Android.
This commit is contained in:
@@ -149,16 +149,22 @@ async function checkAndStoreNativeSharedImage(): Promise<{
|
||||
return { success: false };
|
||||
}
|
||||
|
||||
const platform = Capacitor.getPlatform();
|
||||
logger.debug(
|
||||
`[Main] Checking for ${platform} shared image via SharedImage plugin`,
|
||||
);
|
||||
|
||||
// Use SharedImage plugin to get shared image data directly from native layer
|
||||
// No file I/O or polling needed - direct native-to-JS communication
|
||||
const result = await SharedImage.getSharedImage();
|
||||
let result;
|
||||
try {
|
||||
result = await SharedImage.getSharedImage();
|
||||
} catch (error) {
|
||||
logger.error("[Main] Error calling SharedImage.getSharedImage():", {
|
||||
error: error instanceof Error ? error.message : String(error),
|
||||
stack: error instanceof Error ? error.stack : undefined,
|
||||
});
|
||||
isProcessingSharedImage = false;
|
||||
return { success: false };
|
||||
}
|
||||
|
||||
if (result && result.base64) {
|
||||
// Check if we have valid image data (base64 must be non-null and non-empty)
|
||||
if (result && result.base64 && result.base64.trim().length > 0) {
|
||||
const fileName = result.fileName || "shared-image.jpg";
|
||||
|
||||
// Store in temp database using extracted method
|
||||
@@ -394,13 +400,24 @@ app.mount("#app");
|
||||
logger.info(`[Main] ✅ App mounted successfully`);
|
||||
|
||||
// Check for shared image on initial load (in case app was launched from share sheet)
|
||||
// On Android, share intents are processed in MainActivity.onCreate, so we need to check
|
||||
// after a delay to ensure the native code has finished processing
|
||||
if (
|
||||
Capacitor.isNativePlatform() &&
|
||||
(Capacitor.getPlatform() === "ios" || Capacitor.getPlatform() === "android")
|
||||
) {
|
||||
setTimeout(async () => {
|
||||
await checkForSharedImageAndNavigate();
|
||||
}, 1000); // Small delay to ensure router is ready
|
||||
// Use multiple checks with increasing delays to handle timing issues
|
||||
// Android share intent processing happens in onCreate, which may complete after JS loads
|
||||
const checkDelays =
|
||||
Capacitor.getPlatform() === "android"
|
||||
? [500, 1500, 3000] // Android needs more time for share intent processing
|
||||
: [1000]; // iOS is faster
|
||||
|
||||
checkDelays.forEach((delay) => {
|
||||
setTimeout(async () => {
|
||||
await checkForSharedImageAndNavigate();
|
||||
}, delay);
|
||||
});
|
||||
}
|
||||
|
||||
// Listen for app state changes to detect when app becomes active
|
||||
|
||||
Reference in New Issue
Block a user