Zbuduj skaner QR: samouczek dotyczący React Native Camera

Opublikowany: 2022-03-11

W tym samouczku React Native Camera stworzymy aplikację do odczytu kodów QR. Będzie mógł odczytywać kody QR w czasie rzeczywistym i wyświetlać ich zawartość na ekranie w momencie wykrycia. Będziemy używać szybkiego startu CLI React Native.

(Uwaga: Jeśli potrzebujesz pomocy w konfiguracji, zawsze możesz zapoznać się ze stroną React Native Pierwsze kroki — nie zapomnij kliknąć przycisku „React Native CLI Quickstart”, ponieważ „Expo CLI Quickstart” jest wstępnie wybrany w tym czasie pisania tego artykułu.)

Dlaczego React Native?

React Native to cenna platforma, która zapożycza paradygmat i zasady projektowania Reacta, aby umożliwić błyskawiczne, wieloplatformowe tworzenie zgrabnych interfejsów użytkownika. Facebook, Airbnb, Uber i wiele innych ma już swoje najnowsze aplikacje zbudowane w React Native.

Co to jest kamera natywna React?

React Native Camera (RNCamera) to główny komponent, jeśli chodzi o implementację funkcji kamery w aplikacji React Native. Ten składnik pomaga komunikować się z natywnym systemem operacyjnym za pomocą kilku prostych funkcji, dzięki czemu można korzystać ze sprzętu urządzenia. Możesz budować swoje aplikacje wokół tych funkcji bez kłopotania się kodem natywnym. RNCamera obsługuje już:

  • Zdjęcia
  • Filmy
  • Wykrywanie twarzy
  • Skanowanie kodów kreskowych
  • Rozpoznawanie tekstu (tylko Android)

Zauważ, że RNCamera występowała w dwóch wersjach:

  1. RWKamera
  2. RTCCamera (przestarzałe)

…więc upewnij się, że używasz RNCamera, aby otrzymywać najnowsze aktualizacje.

Uwaga: React Native Camera jest w dużej mierze oparty na module kamery Expo, a poruszanie się tam iz powrotem między nimi jest dość łatwe.

Tworzenie pierwszej aplikacji za pomocą RNCamera

Zanim zaczniemy korzystać z naszego skanera React Native QR, musimy zainstalować kilka zależności.

Instalowanie zależności RNCamera

Nasza konfiguracja wymaga co najmniej JDK w wersji 1.7 (którą najprawdopodobniej masz), a jeśli korzystasz z Androida, będziesz potrzebować buildToolsVersion nowszej niż 25.0.2. (Aby mieć pewność, w dokumentacji znajduje się bardziej szczegółowa i aktualna lista).

Zacznijmy od stworzenia nowego projektu React Native:

 react-native init CameraExample

Teraz wdrożmy pierwszą wersję naszego przykładu React Native Camera na naszym telefonie.

 cd CameraExample react-native run-android

Powinno to wyglądać jak na poniższym zrzucie ekranu:

Emulator Androida wyświetlający ekran powitalny React Native.

Teraz nadszedł czas na zainstalowanie pakietu react-native-camera w naszym projekcie. Skorzystamy z opcji „W większości automatyczna instalacja z reakcją natywną”. (Istnieją inne, takie jak głównie instalacja automatyczna z CocoaPods i instalacja ręczna, ale będziemy trzymać się pierwszej opcji, ponieważ jest najbardziej wydajna.) Po prostu uruchom:

 npm install react-native-camera --save react-native link react-native-camera

Musisz również dodać następujące uprawnienia do 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"

Musisz także ustawić strategię wymiarowania w android/app/build.gradle — nie ma wartości domyślnej, a jeśli jej nie zdefiniujesz, pojawi się błąd:

 defaultConfig { applicationId "com.cameraexample" minSdkVersion rootProject.ext.minSdkVersion + missingDimensionStrategy 'react-native-camera', 'general' targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 versionName "1.0"

Uwaga: strategia wymiarowania powinna normalnie być ustawiona jako general , jak powyżej. Możesz jednak ustawić go na mlkit , jeśli chcesz używać MLKit do rozpoznawania tekstu/twarzy/kodów kreskowych.

Po instalacji będziesz musiał użyć run-android , aby zainstalować nowe zależności:

 react-native run-android

Jeśli wszystko poszło dobrze, powinieneś ponownie zobaczyć ten sam ekran powitalny React Native na swoim urządzeniu lub symulatorze.

Konfigurowanie aparatu

Najpierw zacznijmy od zmodyfikowania App.js i zaimportowania tam RNCamera :

 import { RNCamera } from 'react-native-camera';

Następnie zmodyfikujemy funkcję render , aby uwzględnić naszą nowo zaimportowaną RNCamera . Zwróć uwagę na atrybut style dodany do aparatu, aby zajmował cały ekran. Bez tych stylów renderowanie kamery może być niemożliwe na ekranie, ponieważ nie zajmuje ona miejsca:

 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> ); }

Po dodaniu tego kodu twój interfejs powinien mieć włączony aparat na pełnym ekranie, tak jak na poniższym zrzucie ekranu:

Zrzut ekranu przedstawiający pełnoekranowy komponent kamery. Kamera skierowana jest na monitor komputera, na którym wyświetlane są dwie próbki kodu QR.

Teraz widzimy kody kreskowe (tak jak widzimy nasze testowe kody QR wyświetlane na powyższym monitorze), ale nie możemy ich jeszcze odczytać. Użyjmy algorytmu RNCamera, aby rozpoznać, co jest napisane w każdym z nich.

Odczytywanie informacji o kodzie kreskowym

W celu odczytania informacji o kodzie kreskowym użyjemy właściwości onGoogleVisionBarcodesDetected , aby wywołać funkcję i wyodrębnić informacje. Dodajmy to w komponencie <RNCamera> i połączmy go z funkcją barcodeRecognized , aby się tym zająć. Zwróć uwagę, że onGoogleVisionBarcodesDetected zwraca obiekt zawierający właściwość barcodes , która zawiera tablicę wszystkich kodów kreskowych rozpoznanych przez aparat.

Uwaga: technologia kodów QR onGoogleVisionBarcodesDetected jest dostępna tylko w systemie Android, ale jeśli wolisz podejście wieloplatformowe, lepiej wybierz onBarCodeRead . Obsługuje tylko jeden kod kreskowy na raz — używanie go jako rozwiązania zastępczego jest ćwiczeniem dla czytelnika.

Oto jak powinna wyglądać nasza <RNCamera> po dodaniu onGoogleVisionBarcodesDetected :

 <RNCamera ref={ref => { this.camera = ref; }} style={{ flex: 1, width: '100%', }} onGoogleVisionBarcodesDetected={this.barcodeRecognized} > </RNCamera>

A teraz możemy obsłużyć kody kreskowe w App.js za pomocą poniższej funkcji, która tylko ostrzeże nas w przypadku wykrycia kodu kreskowego i powinna wyświetlić jego zawartość na ekranie:

 barcodeRecognized = ({ barcodes }) => { barcodes.forEach(barcode => console.warn(barcode.data)) };

Oto jak to wygląda w akcji:

Ten sam kąt kamery co poprzednio, teraz z wyskakującymi okienkami konsoli na dole, które dekodują komunikaty w kodach QR: „Cześć z QR1” i adres strony internetowej Toptal.

Renderowanie nakładek z kodem kreskowym

Poprzedni zrzut ekranu pokazuje teraz informacje zawarte w kodzie kreskowym, ale nie pozwala nam wiedzieć, która wiadomość należy do którego kodu kreskowego. W tym celu zagłębimy się w barcodes zwrócone z onGoogleVisionBarcodesDetected i spróbujemy wskazać każdy z kodów kreskowych na naszym ekranie.

Ale najpierw będziemy musieli zapisać rozpoznane kody kreskowe do stanu, abyśmy mogli uzyskać do nich dostęp i renderować nakładkę na podstawie zawartych danych. Zmodyfikujemy teraz naszą wcześniej zdefiniowaną funkcję, aby wyglądała tak:

 barcodeRecognized = ({ barcodes }) => this.setState({ barcodes });

Będziemy teraz musieli dodać obiekt state zainicjowany do pustej tablicy kodów kreskowych, aby nie powodował żadnych błędów w naszych funkcjach render :

 export default class App extends Component<Props> { state = { barcodes: [], } // ...

Stwórzmy teraz funkcję renderBarCodes , którą należy dodać wewnątrz komponentu <RNCamera> :

 <RNCamera ref={ref => { this.camera = ref; }} style={{ flex: 1, width: '100%', }} onGoogleVisionBarcodesDetected={this.barcodeRecognized} > {this.renderBarcodes()} </RNCamera>

Ta funkcja powinna teraz pobierać rozpoznane kody kreskowe ze stanu i wyświetlać je na ekranie:

 renderBarcodes = () => ( <View> {this.state.barcodes.map(this.renderBarcode)} </View> );

Zauważ, że mapowanie jest wskazywane na renderBarcode , który powinien renderować każdy kod kreskowy na ekranie. Dodałem kilka drobnych stylizacji, abyśmy mogli je łatwo rozpoznać:

 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> );

Każdy rozpoznany kod kreskowy ma:

  • Właściwość bounds informująca nas, gdzie na ekranie znaleziono kod kreskowy, której użyjemy do renderowania dla niego nakładki
  • Właściwość data , która pokazuje nam, co jest zakodowane w tym konkretnym kodzie kreskowym
  • Właściwość type , która mówi nam, jaki to jest kod kreskowy (2D, QR itp.)

Użycie tych trzech parametrów, jakie mamy w funkcji render powyżej, daje następujący wynik:

Znowu ten sam kąt kamery, tym razem z dekodowanymi wiadomościami nałożonymi na odpowiadające im kody QR.

Wdrożenie na wielu platformach

Jak wspomniano, RNCamera abstrahuje natywne części modułu kamery do uniwersalnego, wieloplatformowego języka. Należy pamiętać, że niektóre funkcje byłyby dostępne tylko na jednej platformie lub mogą mieć inny sposób napisania na innej. Aby upewnić się, że to, co zamierzasz zbudować, jest obsługiwane na wszystkich wymaganych platformach, najpierw zawsze przeczytaj dokumentację. Co więcej, zawsze lepiej jest przetestować obudowy brzegowe na różnych urządzeniach po zakończeniu implementacji, aby mieć pewność co do solidności swojego produktu.

Idź dalej i dekoduj

Mam nadzieję, że ten mały posmak rozwoju rzeczywistości rozszerzonej okazał się pomocny i że masz teraz podstawową aplikację React Native Camera działającą na telefonie lub symulatorze. Jeśli masz jakieś pytania lub prośby, możesz zostawić komentarz!

Powiązane: Zimne nurkowanie w React Native (samouczek dla początkujących)