0

I try to scan QR code using react-native-qrcode-scanner or vision-camera-dynamsoft-barcode-reader. its perfectly work on android device but its fails to scan or focus the QR code of size (1cm * 1cm) in iOS device. is any way to improve QR code scanner to scan small QR's (1cm * 1cm) in react native? here is my code ...

import React, { useEffect } from 'react';
import { View, Text, StyleSheet, Alert, TouchableOpacity } from 'react-native';
import { Camera, useCameraDevices, useFrameProcessor } from 'react-native-vision-camera';
import { DBRConfig, decode, TextResult } from 'vision-camera-dynamsoft-barcode-reader';
import * as REA from 'react-native-reanimated';
import { StatusBar } from '../components/StatusBar'
import { useFocusEffect } from '@react-navigation/native';
import { RootStackParamList } from '../routes/types';
import { NativeStackScreenProps } from '@react-navigation/native-stack';
import { styles } from '../styles';
import { Body } from '../components/common/Body';

type Props = NativeStackScreenProps<RootStackParamList, 'QRScanner'>
const QRScanner = ({ navigation }: Props) => {
    const [hasPermission, setHasPermission] = React.useState(false);
    const [barcodeResults, setBarcodeResults] = React.useState([] as TextResult[]);
    const [data, setData] = React.useState('');
    const [isActive, setIsActive] = React.useState(true)
    const devices = useCameraDevices();
    const device = devices.back;

    const frameProcessor = useFrameProcessor((frame) => {
        'worklet'
        const config:DBRConfig = {};
        config.template="{\"ImageParameter\":{\"BarcodeFormatIds\":[\"BF_QR_CODE\"],\"Description\":\"\",\"Name\":\"Settings\"},\"Version\":\"3.0\"}"; //scan qrcode only
        const results = decode(frame,config)
        REA.runOnJS(setBarcodeResults)(results);
    }, [])

    useEffect(()=>{
        if(barcodeResults.length > 0){
            if(barcodeResults[0].barcodeFormat === 'QR_CODE'){
                setData(barcodeResults[0].barcodeText);
                Alert.alert('Alert',barcodeResults[0].barcodeText,[
                {
                    text: 'OK',
                    onPress: ()=> setIsActive(true)
                }
                ])
            }
        }
    },[barcodeResults.length > 0])

    useFocusEffect(
        React.useCallback(() => {
            (async () => {
                const status = await Camera.requestCameraPermission();
                setHasPermission(status === 'authorized');
            })();
        }, [])
    )

    return <>
    <StatusBar translucent={true} backgroundColor='#fff' barStyle='dark-content'/>
        <Body >
            <View style={styles.cardContainer}>
                <View style={{ flexDirection:'row', justifyContent:'space-between', width:'100%', paddingVertical:8, alignItems:'flex-end', marginBottom:8 }}>
                    <Text style={styles.pageHeading}>Scan QR Code</Text>
                </View>
                <View style={{ flexGrow:1, width:'100%', justifyContent:'center', alignItems:'center' }}>
                    { device != null &&
                        hasPermission && (
                            <>
                                <Camera
                                    style={{ flexGrow:1 , width:'100%' }}
                                    device={device}
                                    isActive={isActive}
                                    frameProcessor={frameProcessor}
                                    frameProcessorFps={4}
                                />
                            </>
                        )
                    }
                </View>
            </View>
        </Body>
    </>
}


export default QRScanner

0 Answers0