import React, { useState, useEffect, useRef } from 'react';
import { SafeAreaView, View, Text, TouchableOpacity, StyleSheet } from 'react-native';
import { Camera } from 'expo-camera';
export default function HomePage() {
const [hasCameraPermission, setHasCameraPermission] = useState(null);
const cameraRef = useRef(null);
useEffect(() => {
(async () => {
const { status } = await Camera.requestCameraPermissionsAsync();
setHasCameraPermission(status === 'granted');
})();
}, []);
const requestPermission = async () => {
const { status } = await Camera.requestCameraPermissionsAsync();
setHasCameraPermission(status === 'granted');
};
const takePicture = async () => {
if (cameraRef.current) {
try {
const { uri } = await cameraRef.current.takePictureAsync();
console.log('Picture taken:', uri);
} catch (error) {
console.error('Error taking picture:', error);
}
}
};
return (
<SafeAreaView style={styles.container}>
<View style={styles.cameraContainer}>
{hasCameraPermission === null ? (
<Text>Waiting for camera permission...</Text>
) : hasCameraPermission === false ? (
<Text>Camera permission denied.</Text>
) : (
<Camera
style={styles.camera}
type={Camera.Constants.Type.back}
ref={cameraRef}
/>
)}
</View>
<View style={styles.buttonContainer}>
<TouchableOpacity style={styles.button} onPress={requestPermission}>
<Text style={styles.buttonText}>Allow Permission</Text>
</TouchableOpacity>
<TouchableOpacity style={styles.button} onPress={takePicture}>
<Text style={styles.buttonText}>Take Picture</Text>
</TouchableOpacity>
</View>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#f0f0f0',
},
cameraContainer: {
width: '100%',
height: '70%',
justifyContent: 'center',
alignItems: 'center',
backgroundColor: 'black',
},
camera: {
width: '100%',
height: '100%',
},
buttonContainer: {
flexDirection: 'row',
justifyContent: 'space-around',
alignItems: 'center',
width: '100%',
marginTop: 20,
},
button: {
backgroundColor: '#3ABEF9',
paddingVertical: 15,
paddingHorizontal: 30,
borderRadius: 10,
},
buttonText: {
color: 'white',
fontWeight: 'bold',
fontSize: 16,
},
});
app.json
{
"expo": {
"name": "k",
"slug": "k",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"userInterfaceStyle": "light",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"plugins": [
[
"expo-camera",
{
"cameraPermission": "Allow $(PRODUCT_NAME) to access your camera."
}
]
],
"ios": {
"supportsTablet": true
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#ffffff"
}
},
"web": {
"favicon": "./assets/favicon.png"
}
}
}
In this code i see the "TypeError: Cannot read property 'Type' of undefined
This error is located at: in HomePage (created by App) in App (created by withDevTools(App)) in withDevTools(App) in RCTView (created by View) in View (created by AppContainer) in RCTView (created by View) in View (created by AppContainer) in AppContainer in main(RootComponent), js engine: hermes" this error
You used Camera.Constants.Type.back
for type
prop. Please import CameraType
as I’ve shown below and check it:
import { Camera, CameraType } from 'expo-camera/legacy';
.
.
.
const [type, setType] = useState(CameraType.back);
And then use type state for type prop in <Camera>
.