QRスキャナーの構築:ReactNativeCameraチュートリアル
公開: 2022-03-11このReactNativeCameraチュートリアルでは、QRコードリーダーアプリを作成します。 QRコードをリアルタイムで読み取り、検出時に画面にコンテンツを表示することができます。 ReactNativeのCLIクイックスタートを使用します。
(注:これの設定についてサポートが必要な場合は、いつでもReact Nativeのはじめにページを参照できます。「ExpoCLIクイックスタート」が事前に選択されているため、「ReactNativeCLIクイックスタート」ボタンをクリックすることを忘れないでください。この記事を書くことの。)
なぜネイティブに反応するのですか?
React Nativeは、Reactのパラダイムと設計原則を取り入れて、スナッピーなUIの超高速のクロスプラットフォーム開発を可能にする貴重なフレームワークです。 Facebook、Airbnb、Uber、およびその他の多くのアプリには、ReactNativeで構築された最新のアプリがすでにあります。
React Native Cameraとは何ですか?
React Native Camera(RNCamera)は、 ReactNativeアプリにカメラ機能を実装する際の頼りになるコンポーネントです。 このコンポーネントは、デバイスのハードウェアを使用できるように、いくつかの簡単な機能を介してネイティブOSと通信するのに役立ちます。 ネイティブコードの煩わしさを感じることなく、これらの関数を中心にアプリを構築できます。 RNCameraはすでに以下をサポートしています:
- 写真
- ビデオ
- 顔検出
- バーコードスキャン
- テキスト認識(Androidのみ)
RNCameraには2つのフレーバーがあったことに注意してください。
- RNCカメラ
- RCTCamera(非推奨)
…したがって、最新の更新を継続して取得できるように、必ずRNCameraを使用してください。
注: React Native Cameraは、Expoカメラモジュールに大きく基づいており、2つの間を行き来するのは非常に簡単です。
RNCameraを使用して最初のアプリを作成する
React Native QRスキャナーを開始する前に、インストールする必要のある依存関係がいくつかあります。
RNCameraの依存関係のインストール
私たちのセットアップには、少なくともJDKバージョン1.7(おそらく持っている)が必要であり、Androidを使用している場合は、 buildToolsVersion
が必要になります。 (確かに、ドキュメントにはより詳細で最新のリストがあります。)
まず、新しいReactNativeプロジェクトを作成することから始めましょう。
react-native init CameraExample
それでは、ReactNativeCameraの例の最初のバージョンを電話にデプロイしてみましょう。
cd CameraExample react-native run-android
以下のスクリーンショットのようになります。
次に、 react-native-camera
パッケージをプロジェクトにインストールします。 「react-nativeを使用したほとんどの自動インストール」オプションを使用します。 (CocoaPodsを使用したほとんどの自動インストールや手動インストールのようなものもありますが、最も効率的であるため、最初のオプションを使用します。)単純に実行します。
npm install react-native-camera --save react-native link react-native-camera
また、 android/app/src/main/AndroidManifest.xml
に次の権限を追加する必要があります。
package="com.cameraexample"> <uses-permission android:name="android.permission.INTERNET" /> + <uses-permission android:name="android.permission.CAMERA" /> + <uses-permission android:name="android.permission.RECORD_AUDIO"/> + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:name=".MainApplication"
また、 android/app/build.gradle
でディメンション戦略を設定する必要があります。デフォルトはありません。定義しないと、エラーが発生します。
defaultConfig { applicationId "com.cameraexample" minSdkVersion rootProject.ext.minSdkVersion + missingDimensionStrategy 'react-native-camera', 'general' targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0"
注:ディメンション戦略は通常、上記のようにgeneral
に設定する必要があります。 ただし、テキスト/顔/バーコードの認識にMLKitを使用する場合は、代わりにmlkit
に設定できます。
インストール後、 run-android
を使用して新しい依存関係をインストールする必要があります。
react-native run-android
すべてがうまくいけば、デバイスまたはシミュレーターに同じReactNativeウェルカム画面が再び表示されるはずです。
カメラのセットアップ
まず、 RNCamera
を変更し、そこにApp.js
をインポートすることから始めましょう。
import { RNCamera } from 'react-native-camera';
次に、 render
関数を変更して、新しくインポートしたRNCamera
を含めます。 カメラを全画面表示にするために、カメラに追加されたstyle
属性に注目してください。 これらのスタイルがないと、カメラがスペースを占有しないため、画面にカメラのレンダリングが表示されない場合があります。
render() { return ( <View style={styles.container}> - <Text style={styles.welcome}>Welcome to React Native!</Text> - <Text style={styles.instructions}>To get started, edit App.js</Text> - <Text style={styles.instructions}>{instructions}</Text> + <RNCamera + ref={ref => { + this.camera = ref; + }} + style={{ + flex: 1, + width: '100%', + }} + > + </RNCamera> </View> ); }
このコードを追加すると、以下のスクリーンショットのように、インターフェースでカメラが全画面表示になります。

これでバーコードを見ることができますが(上のモニターにテストQRコードが表示されているので)、まだ読み取ることができません。 RNCameraのアルゴリズムを使用して、それぞれの内部に何が書き込まれているかを認識してみましょう。
バーコード情報の読み取り
バーコード情報を読み取るために、 onGoogleVisionBarcodesDetected
を使用して、関数を呼び出して情報を抽出できるようにします。 これを<RNCamera>
コンポーネントに追加し、 barcodeRecognized
関数にリンクして処理しましょう。 onGoogleVisionBarcodesDetected
は、カメラで認識されたすべてのバーコードの配列を含むbarcodes
プロパティを含むオブジェクトを返すことに注意してください。
注: onGoogleVisionBarcodesDetected
QRコードテクノロジーはAndroidでのみ利用できますが、クロスプラットフォームのアプローチが必要な場合は、 onBarCodeRead
を使用することをお勧めします。 一度にサポートされるバーコードは1つだけです。これをフォールバックとして使用することは、読者の練習問題として残されています。
onGoogleVisionBarcodesDetected
を追加した後の<RNCamera>
の外観は次のとおりです。
<RNCamera ref={ref => { this.camera = ref; }} style={{ flex: 1, width: '100%', }} onGoogleVisionBarcodesDetected={this.barcodeRecognized} > </RNCamera>
これで、以下の関数を使用してApp.js
でバーコードを処理できるようになりました。これにより、バーコードが検出された場合にのみ警告が表示され、その内容が画面に表示されます。
barcodeRecognized = ({ barcodes }) => { barcodes.forEach(barcode => console.warn(barcode.data)) };
実際の動作は次のとおりです。
バーコードオーバーレイのレンダリング
前のスクリーンショットはバーコードに含まれる情報を示していますが、どのメッセージがどのバーコードに属しているかを知ることはできません。 このために、 onGoogleVisionBarcodesDetected
から返されたbarcodes
を詳しく調べて、画面上の各バーコードを特定しようとします。
ただし、最初に、認識されたバーコードを状態に保存して、それにアクセスし、含まれているデータに基づいてオーバーレイをレンダリングできるようにする必要があります。 ここで、以前に定義した関数を次のように変更します。
barcodeRecognized = ({ barcodes }) => this.setState({ barcodes });
次に、 render
関数でエラーが発生しないように、バーコードの空の配列に初期化されたstate
オブジェクトを追加する必要があります。
export default class App extends Component<Props> { state = { barcodes: [], } // ...
次に、 <RNCamera>
コンポーネント内に追加する必要があるrenderBarCodes
関数を作成しましょう。
<RNCamera ref={ref => { this.camera = ref; }} style={{ flex: 1, width: '100%', }} onGoogleVisionBarcodesDetected={this.barcodeRecognized} > {this.renderBarcodes()} </RNCamera>
この関数は、状態から認識されたバーコードを取得して、画面に表示する必要があります。
renderBarcodes = () => ( <View> {this.state.barcodes.map(this.renderBarcode)} </View> );
マッピングが、画面上の各バーコードをレンダリングする必要があるrenderBarcode
を指していることに注意してください。 それらを簡単に認識できるように、いくつかのマイナーなスタイルを追加しました。
renderBarcode = ({ bounds, data }) => ( <React.Fragment key={data + bounds.origin.x}> <View style={{ borderWidth: 2, borderRadius: 10, position: 'absolute', borderColor: '#F00', justifyContent: 'center', backgroundColor: 'rgba(255, 255, 255, 0.9)', padding: 10, ...bounds.size, left: bounds.origin.x, top: bounds.origin.y, }} > <Text style={{ color: '#F00', flex: 1, position: 'absolute', textAlign: 'center', backgroundColor: 'transparent', }}>{data}</Text> </View> </React.Fragment> );
認識される各バーコードには次のものがあります。
- 画面上のどこでバーコードが見つかったかを示す
bounds
プロパティ。これを使用して、バーコードのオーバーレイをレンダリングします。 - その特定のバーコードにエンコードされているものを示す
data
プロパティ - バーコードの種類(2D、QRなど)を示す
type
プロパティ
上記のレンダリング関数のようにこれらの3つのパラメーターを使用すると、次の結果が得られます。
クロスプラットフォーム展開
前述のように、RNCameraはカメラモジュールのネイティブ部分をユニバーサルクロスプラットフォーム言語に抽象化します。 一部の機能は1つのプラットフォームでのみ使用可能であるか、別のプラットフォームでの記述方法が異なる場合があることに注意することが重要です。 構築しようとしているものが必要なすべてのプラットフォームでサポートされていることを確認するには、最初のステップとして常にドキュメントを読んでください。 さらに、実装が完了した後、さまざまなデバイスでエッジケースをテストすることをお勧めします。これにより、製品の堅牢性を確認できます。
前進してデコードする
拡張現実開発のこの小さな味がお役に立てば幸いです。また、基本的なReactNativeCameraアプリを携帯電話またはシミュレーターで実行できるようになったことを願っています。 ご不明な点やご要望がございましたら、お気軽にコメントをお寄せください。