Je développe une application qui lit les codes QR à l'aide de la caméra react-native, mais l'aperçu de la caméra n'apparaît pas à l'écran.
Je travaille sur react-native 0.57.7 , en utilisant react-native-camera 1.10.0 . J'ai exécuté les commandes suivantes:
npm install react-native-camera --save
react-native link react-native-camera
Voici où j'appelle la caméra dans mon code:
<RNCamera
ref={ref => {
this.camera = ref;
}}
defaultTouchToFocus
mirrorImage={false}
permissionDialogTitle={'Permission to use camera'}
permissionDialogMessage={'We need your permission to use your camera phone'}
style={{flex: 1}}
/>La boîte de dialogue d'autorisation s'ouvre et elle montre même un élément de chargement la première fois, j'ouvre l'application, mais l'aperçu de la caméra n'apparaît jamais. Y a-t-il un moyen de l'afficher sur mon application?
EDIT: Je l'ai fait fonctionner! J'ai défini manuellement le style de la caméra:
import React, {Component} from 'react';
import {View, Image, TouchableOpacity, ScrollView} from 'react-native';
import RNCamera from 'react-native-camera';
class profPresencaScreen extends Component{
<View style={{flex: 1}}>
<RNCamera
ref={ref => {
this.camera = ref;
}}
defaultTouchToFocus
mirrorImage={false}
permissionDialogTitle={'Permission to use camera'}
permissionDialogMessage={'We need your permission to use your camera phone'}
/>
</View>
}
export default profPresencaScreen;
C'est aussi simple que ça! Merci à tous ceux qui ont essayé de vous aider!
3 Réponses :
J'ai eu le même problème et la configuration de captureAdio = {false} m'a aidé.
render() {
return (
<Container>
<View style={StyleSheet.cameraContainer}>
<RNCamera
ref={ref => {
this.camera = ref;
}}
style = {StyleSheet.preview}
type={RNCamera.Constants.Type.back}
flashMode={RNCamera.Constants.FlashMode.on}
captureAudio={false}
permissionDialogTitle={'Permission to use camera'}
permissionDialogMessage={'We need your permission to use your camera phone'}
onGoogleVisionBarcodesDetected={({ barcodes }) => {
console.log(barcodes)
}}
/>
<Button style = {StyleSheet.capture}
full info large onPress={() => this.takePicture()}>
<Text> Take picture </Text>
</Button>
</View>
</Container>
);
}
Avez-vous configuré les autorisations dans le fichier info.plist?
D'après la documentation: https://github.com/react-native-community/react -native-camera
Avec iOS 10 et supérieur, vous devez ajouter la clé "Confidentialité - Description de l'utilisation de la caméra" à l'Info.plist de votre projet. Cela devrait être trouvé dans 'votre_projet / ios / votre_projet / Info.plist'. Ajoutez le code suivant: NSCameraUsageDescription Votre message à l'utilisateur lors du premier accès à la caméra
NSPhotoLibraryUsageDescription Votre message à l'utilisateur lorsque vous accédez pour la première fois à la photothèque
NSMicrophoneUsageDescription Votre message à l'utilisateur lorsque vous accédez au microphone pour la première fois Sur Android, vous avez besoin de buildToolsVersion de 25.0.2+. Cela devrait être facilement et automatiquement téléchargé par le gestionnaire de SDK d'Android Studio.
Sur iOS 11 et versions ultérieures, vous devez ajouter la clé NSPhotoLibraryAddUsageDescription à Info.plist. Cette clé vous permet de décrire la raison pour laquelle votre application demande un accès en écriture seule à la photothèque de l'utilisateur. Info.plist se trouve dans 'votre_projet / ios / votre_projet / Info.plist'. Ajoutez le code suivant:
NSPhotoLibraryAddUsageDescription Votre message à l'utilisateur lorsque vous accédez pour la première fois à la photothèque
vous pouvez utiliser react-native-camera-kit au lieu de react-native-camera .
suivez les étapes ci-dessous.
import { StyleSheet, View, Text, Platform, TouchableOpacity, Linking, PermissionsAndroid } from 'react-native';
import { CameraKitCameraScreen, } from 'react-native-camera-kit';
export default class App extends Component {
constructor() {
super();
this.state = {
QR_Code_Value: '',
Start_Scanner: false,
};
}
openLink_in_browser = () => {
Linking.openURL(this.state.QR_Code_Value);
}
onQR_Code_Scan_Done = (QR_Code) => {
this.setState({ QR_Code_Value: QR_Code });
this.setState({ Start_Scanner: false });
}
open_QR_Code_Scanner=()=> {
var that = this;
if (Platform.OS === 'android') {
async function requestCameraPermission() {
try {
const granted = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.CAMERA, {
'title': 'Camera App Permission',
'message': 'Camera App needs access to your camera '
}
)
if (granted === PermissionsAndroid.RESULTS.GRANTED) {
that.setState({ QR_Code_Value: '' });
that.setState({ Start_Scanner: true });
} else {
alert("CAMERA permission denied");
}
} catch (err) {
alert("Camera permission err", err);
console.warn(err);
}
}
requestCameraPermission();
} else {
that.setState({ QR_Code_Value: '' });
that.setState({ Start_Scanner: true });
}
}
render() {
if (!this.state.Start_Scanner) {
return (
<View style={styles.MainContainer}>
<Text style={{ fontSize: 22, textAlign: 'center' }}>React Native Scan QR Code Example</Text>
<Text style={styles.QR_text}>
{this.state.QR_Code_Value ? 'Scanned QR Code: ' + this.state.QR_Code_Value : ''}
</Text>
{this.state.QR_Code_Value.includes("http") ?
<TouchableOpacity
onPress={this.openLink_in_browser}
style={styles.button}>
<Text style={{ color: '#FFF', fontSize: 14 }}>Open Link in default Browser</Text>
</TouchableOpacity> : null
}
<TouchableOpacity
onPress={this.open_QR_Code_Scanner}
style={styles.button}>
<Text style={{ color: '#FFF', fontSize: 14 }}>
Open QR Scanner
</Text>
</TouchableOpacity>
</View>
);
}
return (
<View style={{ flex: 1 }}>
<CameraKitCameraScreen
showFrame={true}
scanBarcode={true}
laserColor={'#FF3D00'}
frameColor={'#00C853'}
colorForScannerFrame={'black'}
onReadCode={event =>
this.onQR_Code_Scan_Done(event.nativeEvent.codeStringValue)
}
/>
</View>
);
}
}
const styles = StyleSheet.create({
MainContainer: {
flex: 1,
paddingTop: (Platform.OS) === 'ios' ? 20 : 0,
alignItems: 'center',
justifyContent: 'center',
},
QR_text: {
color: '#000',
fontSize: 19,
padding: 8,
marginTop: 12
},
button: {
backgroundColor: '#2979FF',
alignItems: 'center',
padding: 12,
width: 300,
marginTop: 14
},
});
Accédez à YourReactNativeProject -> android -> app -> src -> main -> AndroidManifest.xml et ajoutez ci-dessous l'autorisation.
<uses-permission android:name="android.permission.CAMERA"/>
Ci-dessous le code associé pour la numérisation de la caméra / du code QR.
1] npm install react-native-camera-kit --save 2] react-native link react-native-camera-kit
Le lien automatique a-t-il fonctionné avec succès? Avez-vous essayé de le lier manuellement?
Faites-vous des tests sur un appareil ou dans un simulateur?
Le lien automatique fonctionnait, mais comme j'essayais de le lier manuellement, j'ai vu qu'il y avait des commandes qui étaient dupliquées. Je vais le tester à nouveau!
Je teste sur appareil + simulateur, les deux agissent de la même manière
Salut, avez-vous réussi? J'ai aussi le même problème.