app상에서 카메라로 바코드 리딩을 하기 위해 react-native-camera library를 설치하였다.
안드로이드용 앱이므로 안드로이드용으로만 적용했다.
npm i --save react-native-camera
android/app/build.gradle
defaultConfig {
...
missingDimensionStrategy 'react-native-camera', 'general' <--이 부분 추가
}
android/app/src/main/AndroidMenifest.xml
<uses-permission android:name="android.permission.CAMERA" />
어두운경우에도 바코드를 찍을 수 있어 플래쉬모드는 항상 켜지도록 설정하였다.
import React, {Component} from 'react';
import {Button, Text, View} from 'react-native';
import {RNCamera} from 'react-native-camera';
class ProductScanRNCamera extends Component {
constructor(props) {
super(props);
this.camera = null;
this.barcodeCodes = [];
this.state = {
camera: {
type: RNCamera.Constants.Type.back,
// flashMode: RNCamera.Constants.FlashMode.auto,
flashMode: RNCamera.Constants.FlashMode.torch,
},
};
}
onBarCodeRead(scanResult) {
if (scanResult.data != null) {
if (!this.barcodeCodes.includes(scanResult.data)) {
this.barcodeCodes.push(scanResult.data);
this.props.closeCamera(scanResult.data);
console.log('onBarCodeRead call');
}
}
return;
}
async takePicture() {
if (this.camera) {
const options = {quality: 0.5, base64: true};
const data = await this.camera.takePictureAsync(options);
}
}
pendingView() {
return (
<View
style={{
flex: 1,
backgroundColor: 'lightgreen',
justifyContent: 'center',
alignItems: 'center',
}}>
<Text>Waiting</Text>
</View>
);
}
render() {
return (
<View style={styles.container}>
<RNCamera
ref={(ref) => {
this.camera = ref;
}}
defaultTouchToFocus
flashMode={this.state.camera.flashMode}
mirrorImage={false}
onBarCodeRead={this.onBarCodeRead.bind(this)}
onFocusChanged={() => {}}
onZoomChanged={() => {}}
style={styles.preview}
type={this.state.camera.type}
/>
<View style={[styles.overlay, styles.topOverlay]}>
<Text style={styles.scanScreenMessage}>Please scan the barcode.</Text>
</View>
<View style={[styles.overlay, styles.bottomOverlay]}>
</View>
</View>
);
}
}
const styles = {
container: {
flex: 1,
},
preview: {
flex: 1,
justifyContent: 'flex-end',
alignItems: 'center',
},
overlay: {
position: 'absolute',
padding: 16,
right: 0,
left: 0,
alignItems: 'center',
},
topOverlay: {
top: 0,
flex: 1,
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
},
bottomOverlay: {
bottom: 0,
backgroundColor: 'rgba(0,0,0,0.4)',
flexDirection: 'row',
justifyContent: 'center',
alignItems: 'center',
},
enterBarcodeManualButton: {
padding: 15,
backgroundColor: 'white',
borderRadius: 40,
},
scanScreenMessage: {
fontSize: 14,
color: 'white',
textAlign: 'center',
alignItems: 'center',
justifyContent: 'center',
},
};
export default ProductScanRNCamera;