Fix camera unmount crash via overlay architecture

This commit is contained in:
2026-05-31 14:30:19 +02:00
parent 2b5a259fe5
commit ac8f0722d1
+27 -37
View File
@@ -81,24 +81,36 @@ export default function App() {
};
// 3. Conditional Screen Rendering
const renderScreen = () => {
switch (currentScreen) {
case 'camera':
return (
<GestureHandlerRootView style={styles.container}>
<SafeAreaView style={styles.container}>
<StatusBar hidden={true} />
{/*
Keep CameraScreen ALWAYS mounted in the background to prevent
Android expo-camera hardware crashes when unmounting right after capture
*/}
<View style={StyleSheet.absoluteFill}>
<CameraScreen
countdownDuration={settings.countdownDuration}
onPhotoCaptured={handlePhotoCaptured}
onBurstComplete={handleBurstComplete}
onCancel={handleReset}
isIdle={false}
isIdle={currentScreen === 'home'}
onStartBooth={handleStartBooth}
onNavigateToAdmin={handleOpenAdmin}
adminPassword={settings.adminPassword}
welcomeText={settings.welcomeText}
burstCount={settings.burstCount}
burstIntervalSec={settings.burstIntervalSec}
frameMode={settings.frameMode}
selectedFrameId={settings.selectedFrameId}
/>
);
case 'preview':
return (
</View>
{/* Overlay PreviewScreen if active */}
{currentScreen === 'preview' && (
<View style={StyleSheet.absoluteFill}>
<PreviewScreen
photoUris={photoUris}
printerIp={settings.printerIp}
@@ -112,41 +124,19 @@ export default function App() {
dateOverlayPosition={settings.dateOverlayPosition}
eventText={settings.eventText}
/>
);
case 'admin':
return (
</View>
)}
{/* Overlay AdminScreen if active */}
{currentScreen === 'admin' && (
<View style={StyleSheet.absoluteFill}>
<AdminScreen
currentSettings={settings}
onSave={handleSaveSettings}
onClose={() => setCurrentScreen('home')}
/>
);
default:
return (
<CameraScreen
countdownDuration={settings.countdownDuration}
onPhotoCaptured={handlePhotoCaptured}
onBurstComplete={handleBurstComplete}
onCancel={handleReset}
isIdle={true}
onStartBooth={handleStartBooth}
onNavigateToAdmin={handleOpenAdmin}
adminPassword={settings.adminPassword}
welcomeText={settings.welcomeText}
burstCount={settings.burstCount}
burstIntervalSec={settings.burstIntervalSec}
frameMode={settings.frameMode}
selectedFrameId={settings.selectedFrameId}
/>
);
}
};
return (
<GestureHandlerRootView style={styles.container}>
<SafeAreaView style={styles.container}>
<StatusBar hidden={true} />
{renderScreen()}
</View>
)}
</SafeAreaView>
</GestureHandlerRootView>
);