英文:
Cannot capture photo with react-native-vision-camera
问题
It seems like you're having trouble with the handleCapture
function not being called when you press the button to take a picture using the camera in your React Native app. The issue might be related to the way you're using the react-native-vision-camera
library. Here are a few things to check:
-
Permissions: Ensure that you have requested the necessary camera permissions in your app. You need to specify camera permissions in your AndroidManifest.xml (for Android) and Info.plist (for iOS). Without proper permissions, the camera won't work.
-
Camera Initialization: Make sure that the camera is initialized properly. In your code, you're using
const mycam = useRef(null);
, but it's important to ensure that the camera is initialized and ready for use before callingmycam.current.takePhoto()
. -
Error Handling: Check for any error messages or exceptions related to the camera. You can use try-catch blocks to capture and log any errors that might occur during camera operations.
-
Logging: You mentioned that there's a "HNG RISK" message in purple font in the Xcode logs. This could be related to some warnings or errors in your code. Investigate this message further to identify any potential issues.
-
Debugging: Use debugging tools like React Native Debugger or the built-in debugging tools of your IDE (Xcode for iOS, Android Studio for Android) to inspect the state of your app and see if there are any runtime errors or issues.
Without access to the full context and logs, it's challenging to pinpoint the exact issue. You might need to investigate each of these areas to determine what's causing the problem with the camera not working as expected in your app.
英文:
import {Button} from '@rneui/base';
import React, {useState, useEffect, useRef} from 'react';
import {
View,
TextInput,
Text,
FlatList,
Modal,
TouchableOpacity,
Image,
StyleSheet,
} from 'react-native';
import {Camera, useCameraDevices} from 'react-native-vision-camera';
const ReportComponent = () => {
const [reports, setReports] = useState([]);
const [newReport, setNewReport] = useState('');
const [editingIndex, setEditingIndex] = useState(null);
const [isModalVisible, setIsModalVisible] = useState(false);
const [isCameraVisible, setIsCameraVisible] = useState(false);
// const [capturedImage, setCapturedImage] = useState(null);
const devices = useCameraDevices('wide-angle-camera');
const device = devices.back;
const mycam = useRef(null);
const [pics, setPics] = useState([]);
const [newPic, setNewPic] = useState('');
const [picIndex, setPicIndex] = useState(null);
const addReport = () => {
if (newReport.trim() === '') {
return;
}
if (editingIndex !== null) {
// Editing existing report
const updatedReports = [...reports];
updatedReports[editingIndex] = newReport;
setReports(updatedReports);
setNewReport('');
setEditingIndex(null);
} else {
// Adding new report
setReports([...reports, newReport]);
setNewReport('');
}
setIsModalVisible(false);
};
const addPic = () => {
if (newPic.trim() === '') {
return;
}
if (picIndex !== null) {
// Editing existing pic
const updatedPics = [...pics];
updatedPics[picIndex] = newPic;
setPics(updatedPics);
setNewPic('');
setPicIndex(null);
} else {
// Adding new report
setPics([...pics, newPic]);
setNewPic('');
}
setIsModalVisible(false);
};
const deleteReport = index => {
const updatedReports = [...reports];
updatedReports.splice(index, 1);
setReports(updatedReports);
};
const editReport = index => {
const reportToEdit = reports[index];
setNewReport(reportToEdit);
setEditingIndex(index);
setIsModalVisible(true);
};
const toggleModal = () => {
setIsModalVisible(!isModalVisible);
};
const toggleCamera = () => {
setIsCameraVisible(!isCameraVisible);
toggleModal();
};
const handleCapture = async () => {
console.log('handlecapture run');
if (mycam != null) {
const photo = await mycam.current.takePhoto();
console.log('CAMERAPIC: ', photo.path);
setNewPic(photo.path);
addPic();
setIsCameraVisible(false);
toggleModal();
}
};
return (
<View style={{flex: 1}}>
<Button title="Add Report" onPress={toggleModal} />
<FlatList
data={reports}
renderItem={({item, index}) => (
<View style={{flexDirection: 'row', alignItems: 'center'}}>
<Text style={{flex: 1}}>{item}</Text>
<Button title="Edit" onPress={() => editReport(index)} />
<Button title="Delete" onPress={() => deleteReport(index)} />
</View>
)}
keyExtractor={(item, index) => index.toString()}
/>
<Modal visible={isModalVisible} animationType="slide" transparent={true}>
<View
style={{
flex: 1,
justifyContent: 'center',
backgroundColor: 'rgba(0, 0, 0, 0.5)',
}}>
<View style={{margin: 20, backgroundColor: 'white', padding: 20}}>
<TextInput
placeholder="Enter report (max 10 lines)"
value={newReport}
onChangeText={setNewReport}
multiline={true}
numberOfLines={10}
style={{height: 150, borderWidth: 1, padding: 10}}
/>
<TouchableOpacity onPress={toggleCamera}>
<Text
style={{color: 'blue', textAlign: 'center', marginBottom: 10}}>
Take Picture
</Text>
</TouchableOpacity>
{/* {capturedImage && (
<View style={{alignItems: 'center', marginBottom: 10}}>
<Image
source={{uri: capturedImage.uri}}
style={{width: 200, height: 200}}
/>
</View>
)} */}
<Button
title={editingIndex !== null ? 'Update Report' : 'Add Report'}
onPress={addReport}
/>
<TouchableOpacity onPress={toggleModal} style={{marginTop: 10}}>
<Text style={{color: 'blue', textAlign: 'center'}}>Cancel</Text>
</TouchableOpacity>
{console.log('PICS::::::', pics[0])}
</View>
</View>
</Modal>
{isCameraVisible && (
<View style={StyleSheet.absoluteFill}>
<Camera
style={{flex: 1}}
autoFocus="on"
photo={true}
device={device}
isActive={isCameraVisible}
ref={mycam}
/>
<TouchableOpacity
onPress={() => {
handleCapture();
}}
style={{
flex: 1,
height: 50,
width: 50,
borderRadius: 30,
backgroundColor: 'red',
position: 'absolute',
bottom: 50,
alignSelf: 'center',
}}></TouchableOpacity>
</View>
)}
<View>
<Image
source={{uri: `file://${pics[0]}`}}
style={{width: 100, height: 100}}
/>
</View>
</View>
);
};
export default ReportComponent;
I am trying to write an app that can create a report and take picture for that report , its working but I cannot make camera work in the above code the handleCapture
function is not called at all when I press it. however I can see camera on my screen . there is nothing in the logs except when I run it in Xcode I see HNG RISK in purple font, what is it that I am doing wrong here
答案1
得分: 1
Change onPress to this.
将onPress更改为这样。
Yours is not getting clicked at all.
你的根本没有被点击。
onPress={handleCapture}
onPress={handleCapture}
<TouchableOpacity
onPress={
handleCapture;
}
style={{
flex: 1,
height: 50,
width: 50,
borderRadius: 30,
backgroundColor: 'red',
position: 'absolute',
bottom: 50,
alignSelf: 'center',
}}>
Naming this would also better
</TouchableOpacity>
给这个起个名字会更好
英文:
There seems to be a few issues:
Change onPress to this.
Yours is not getting clicked at all.
onPress={handleCapture}
<TouchableOpacity
onPress={
handleCapture;
}
style={{
flex: 1,
height: 50,
width: 50,
borderRadius: 30,
backgroundColor: 'red',
position: 'absolute',
bottom: 50,
alignSelf: 'center',
}}>
*Naming this would also better*
</TouchableOpacity>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论