Fix Camera permissions and enable front camera fallback on Android

This commit is contained in:
2026-06-10 13:30:47 +02:00
parent d72ddced88
commit ac7542d2f9
2 changed files with 42 additions and 26 deletions
BIN
View File
Binary file not shown.
+40 -24
View File
@@ -8,6 +8,7 @@ import {
Modal,
TextInput,
TouchableWithoutFeedback,
PermissionsAndroid,
} from 'react-native';
import { CameraView, useCameraPermissions } from 'expo-camera';
import * as FileSystem from 'expo-file-system';
@@ -131,7 +132,24 @@ export default function CameraScreen({
if (permission && !permission.granted && permission.canAskAgain) {
requestPermission();
}
}, []);
// Specifically for ausbc native library which needs these at runtime
if (Platform.OS === 'android') {
const requestAndroidPerms = async () => {
try {
const granted = await PermissionsAndroid.requestMultiple([
PermissionsAndroid.PERMISSIONS.CAMERA,
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE,
PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE,
]);
logger.log('Android Permissions:', JSON.stringify(granted));
} catch (err) {
console.warn('Failed to request Android permissions', err);
}
};
requestAndroidPerms();
}
}, [permission]);
// 2. Check if a USB camera is connected.
useEffect(() => {
@@ -400,29 +418,27 @@ export default function CameraScreen({
}
};
// On iOS we need the expo-camera permission, on Android we bypass it since we use USB
if (Platform.OS !== 'android') {
if (!permission) {
return (
<View style={styles.container}>
<Text style={styles.infoText}>Berechtigungen werden geladen...</Text>
</View>
);
}
// Show permission block if built-in camera has no permission AND USB is not connected
if (!permission) {
return (
<View style={styles.container}>
<Text style={styles.infoText}>Berechtigungen werden geladen...</Text>
</View>
);
}
if (!permission.granted && !isUsbConnected) {
return (
<View style={styles.container}>
<Text style={styles.infoText}>Wir benötigen deine Erlaubnis, um die Kamera anzuzeigen</Text>
<TouchableOpacity style={styles.btn} onPress={requestPermission}>
<Text style={styles.btnText}>Erlaubnis erteilen</Text>
</TouchableOpacity>
<TouchableOpacity style={[styles.btn, styles.cancelBtn]} onPress={handleLocalCancel}>
<Text style={styles.btnText}>Zurück</Text>
</TouchableOpacity>
</View>
);
}
if (!permission.granted && !isUsbConnected) {
return (
<View style={styles.container}>
<Text style={styles.infoText}>Wir benötigen deine Erlaubnis, um die Tablet-Kamera anzuzeigen</Text>
<TouchableOpacity style={styles.btn} onPress={requestPermission}>
<Text style={styles.btnText}>Erlaubnis erteilen</Text>
</TouchableOpacity>
<TouchableOpacity style={[styles.btn, styles.cancelBtn]} onPress={handleLocalCancel}>
<Text style={styles.btnText}>Zurück</Text>
</TouchableOpacity>
</View>
);
}
const renderContent = () => {
@@ -628,7 +644,7 @@ export default function CameraScreen({
{/* Camera Preview Background */}
<View style={styles.previewContainer}>
<View style={styles.cameraWrapper}>
{Platform.OS === 'android' ? (
{Platform.OS === 'android' && isUsbConnected ? (
<UsbCameraView
ref={usbCameraRef}
style={[styles.cameraPreview, { position: 'absolute', opacity: 1, zIndex: 10 }]}