I'm having issues getting the camera to display correctly in my react native app. I'm using an older version of react native vision camera v 2.16.2 because the latest one wasn't running with my version of react native. The camera opens us and asks the user for permission but then once it opens to the camera screen, it almost appears as if the camera is off screen. The round picture taking button is all the way at the top of the screen. I've tried reformatting but it doesn't change the location. Anyone experience this? Below is my code and screenshots of the app.
function AddPicture() {
const [cameraPosition, setCameraPosition] = useState('back')
const [showCamera, setShowCamera] = useState(true);
const [imageSource, setImageSource] = useState('');
const devices = useCameraDevices()?.[cameraPosition];
const camera = useRef(null);
useEffect(() => {
async function getPermission() {
const newCameraPermission = await Camera.requestCameraPermission();
console.log("permission status: ", newCameraPermission);
// If denied - opens settings for the user to update permissions
if (newCameraPermission === 'denied') {
await Linking.openSettings();
}
};
getPermission();
}, []);
const capturePhoto = async () => {
if (camera.current !== null) {
const photo = await camera.current.takePhoto({
flash:'on'
});
setImageSource(photo.path);
setShowCamera(false);
console.log(photo.path);
}
};
const handleBack = () => {
setShowCamera(true);
setImageSource(''); // Reset imageSource when going back to the camera
};
if (devices == null) {
return <Text>Camera not available</Text>;
}
return (
<View style={styles.container}>
{showCamera ? (
<>
<Camera
ref={camera}
style={StyleSheet.absoluteFill}
device={devices}
isActive={showCamera}
photo={true}
/>
<View style={styles.buttonContainer}>
<TouchableOpacity
style={styles.camButton}
onPress={() => capturePhoto()}
/>
</View>
</>
) : (
<>
{imageSource !== '' ? (
<Image
style={styles.image}
source={{
uri: `file://'${imageSource}`,
}}
/>
) : null}
<View style={styles.backButton}>
<TouchableOpacity
style={{
backgroundColor: 'rgba(0,0,0,0.2)',
padding: 10,
justifyContent: 'center',
alignItems: 'center',
borderRadius: 10,
borderWidth: 2,
borderColor: '#fff',
width: 100,
}}
onPress={handleBack}>
<Text style={{color: 'white', fontWeight: '500'}}>Back</Text>
</TouchableOpacity>
</View>
<View style={styles.buttonContainer}>
<View style={styles.buttons}>
<TouchableOpacity
style={{
backgroundColor: '#fff',
padding: 10,
justifyContent: 'center',
alignItems: 'center',
borderRadius: 10,
borderWidth: 2,
borderColor: '#77c3ec',
}}
onPress={() => setShowCamera(true)}>
<Text style={{color: '#77c3ec', fontWeight: '500'}}>
Retake
</Text>
</TouchableOpacity>
<TouchableOpacity
style={{
backgroundColor: '#77c3ec',
padding: 10,
justifyContent: 'center',
alignItems: 'center',
borderRadius: 10,
borderWidth: 2,
borderColor: 'white',
}}
onPress={() => {
setShowCamera(true)
setImageSource(''); // Reset imageSource when going back to the camera
}}>
<Text style={{color: 'white', fontWeight: '500'}}>
Use Photo
</Text>
</TouchableOpacity>
</View>
</View>
</>
)}
</View>
);
}
export default AddPicture;
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
button: {
backgroundColor: 'gray',
},
backButton: {
backgroundColor: 'rgba(0,0,0,0.0)',
position: 'absolute',
justifyContent: 'center',
width: '100%',
top: 0,
padding: 20,
},
buttonContainer: {
backgroundColor: 'rgba(0,0,0,0.2)',
position: 'absolute',
justifyContent: 'center',
alignItems: 'center',
width: '100%',
bottom: 0,
padding: 20,
},
buttons: {
flexDirection: 'row',
justifyContent: 'space-between',
width: '100%',
},
camButton: {
height: 80,
width: 80,
borderRadius: 40,
//ADD backgroundColor COLOR GREY
backgroundColor: '#B2BEB5',
alignSelf: 'center',
borderWidth: 4,
borderColor: 'white',
},
image: {
width: '100%',
height: '100%',
aspectRatio: 9 / 16,
},
});