React Native

React Native 카메라로 QR code 읽어오기 (react-native-vision-camera)

citron031 2023. 2. 17. 08:54

리액트 네이티브에서 카메라로 QR Code를 읽어오는 방법에 대해서 기록을 남기고자 한다.

사용한 카메라 라이브러리는 가장 많이 사용되었지만 deprecated된 react-native-camera의 공식문서에서 추천하는 react-native-vision-camera를 사용하였다.

사용한 라이브러리는 다음과 같이 설치할 수 있다.

npm i react-native-vision-camera vision-camera-code-scanner react-native-reanimated
npx pod-install

react-native-reanimated가 사용되었기에 최상단 index.js에서 import 'react-native-reanimated';로 불러온 뒤 babel.config.js를 다음과 같이 수정해준다.

module.exports = {
  ...
  plugins: [
    ...
    [
      'react-native-reanimated/plugin',
      {
        globals: ['__scanCodes'],
      },
    ],
  ],
};

카메라 권한을 얻기 위해서 ios, android 모두 네이티브단의 설정이 필요한데, 이는 공식문서를 참고한다.

https://mrousavy.com/react-native-vision-camera/docs/guides/#updating-manifests

 

Getting Started | VisionCamera

Installing the library

mrousavy.com

그리고 다음과 같이 권한 요청을 보낼 수 있다.

// 카메라 권한 요청하기
const cameraPermission = await Camera.getCameraPermissionStatus();
// 마이크 권한 요청하기
const microphonePermission = await Camera.getMicrophonePermissionStatus();

권한 요청의 결과값이 "authorized"라면 해당 권한을 획득한 것이다.

 

기본적인 카메라의 사용법은 공식문서에도 확인할 수 있듯 다음과 같다.

import {useCameraDevices, Camera} from 'react-native-vision-camera';

function App() {
  const devices = useCameraDevices()
  const device = devices.back

  return (
    {device ? 
      <Camera
        style={StyleSheet.absoluteFill}
        device={device}
        isActive={true}
      /> : null}
  )
}

다만, 카메라에 barcode를 읽을 수 있는 기능을 추가하기 위해서는 vision-camera-code-scanner를 사용하고 react-native-reanimated를 설정해야 한다. (위에서 미리 설정했다)

설정이 끝났다면, vision-camera-code-scanner 공식문서에서 제공하는 예제코드가 작동하는 것을 알 수 있다.

이를 간략화해서 설명하자면,

import React, {useState, useEffect} from 'react';

import {Text} from 'react-native';
import {useCameraDevices, Camera} from 'react-native-vision-camera';
import {useScanBarcodes, BarcodeFormat} from 'vision-camera-code-scanner';

function App() {
  const [hasPermission, setHasPermission] = useState(false);
  const devices = useCameraDevices();
  const device = devices.back;

  const [frameProcessor, barcodes] = useScanBarcodes([BarcodeFormat.QR_CODE], {
    checkInverted: true,
  });

  useEffect(() => {
    // 권한을 요청한다.
    (async () => {
      const status = await Camera.requestCameraPermission();
      setHasPermission(status === 'authorized');
    })();
  }, []);
  
  useEffect(() => {
    if (barcodes && barcodes[0]?.displayValue) {
      // 바코드(QR Code)를 읽었을 때 값을 출력한다.
      console.log(barcodes[0].displayValue);
    }
  }, [barcodes]);

  if (!device || !hasPermission) {
    return null;
  }
  return (
      <Camera
        style={StyleSheet.absoluteFill}
        device={device}
        isActive={true}
        frameProcessor={frameProcessor}
        frameProcessorFps={5}
      />
    )
  );
}

export default App;

다만, 위의 useEffect로 바코드 값을 가져오는 방식은 렌더링이 계속 일어나기에 최적화가 필요한 부분 같다.

이렇게 react-native-vision-camera를 사용하여 QR Code를 읽어오는 법을 확인했다.

카메라 컴포넌트는 필요한 부분에서만 조건부 렌더링으로 렌더링되고 값을 읽어오면 렌더링을 하지 않는 방식으로 조작하는 것이 좋을 것 같다.

만약, QR Code가 아닌 다른 바코드값을 읽어오고자 한다면, useScanBarcodes의 첫 번째 인자인 배열 내부의 BarcodeFormat 값을 변경할 수 있다.

 

 

https://www.npmjs.com/package/react-native-vision-camera

 

react-native-vision-camera

The Camera library that sees the vision.. Latest version: 2.15.4, last published: 15 days ago. Start using react-native-vision-camera in your project by running `npm i react-native-vision-camera`. There are 15 other projects in the npm registry using react

www.npmjs.com

https://www.npmjs.com/package/vision-camera-code-scanner

 

vision-camera-code-scanner

VisionCamera Frame Processor Plugin to read barcodes using MLKit Vision Barcode Scanning. Latest version: 0.2.0, last published: 10 months ago. Start using vision-camera-code-scanner in your project by running `npm i vision-camera-code-scanner`. There are

www.npmjs.com

 

🍨 QR 코드를 읽을 수 있는 다른 카메라 라이브러리로는 react-native-camera-kit이 있다.

https://www.npmjs.com/package/react-native-camera-kit

 

react-native-camera-kit

A high performance, fully featured, rock solid camera library for React Native applications. Latest version: 13.0.0, last published: 6 months ago. Start using react-native-camera-kit in your project by running `npm i react-native-camera-kit`. There are 11

www.npmjs.com