Bir QR Tarayıcı Oluşturun: Bir React Yerel Kamera Eğitimi

Yayınlanan: 2022-03-11

Bu React Native Camera eğitiminde, bir QR kod okuyucu uygulaması oluşturacağız. QR kodlarını gerçek zamanlı olarak okuyabilecek ve algılama anında içeriğini ekrana aktarabilecektir. React Native'in CLI Quickstart'ını kullanacağız.

(Not: Bunu ayarlamak için yardıma ihtiyacınız olursa, her zaman React Native Başlarken sayfasına başvurabilirsiniz; “React Native CLI Quickstart” düğmesine tıklamayı unutmayın, çünkü o sırada “Expo CLI Quickstart” önceden seçilmiş olarak gelir. Bu makaleyi yazarken.)

Neden React Native?

React Native, hızlı kullanıcı arayüzlerinin yıldırım hızında, platformlar arası geliştirilmesini sağlamak için React'in paradigmasını ve tasarım ilkelerini ödünç alan değerli bir çerçevedir. Facebook, Airbnb, Uber ve diğerleri, React Native ile oluşturulmuş en yeni uygulamalarına sahipler.

React Native Camera Nedir?

React Native Camera (RNCamera), bir React Native uygulamasında kamera işlevselliğinin uygulanması söz konusu olduğunda gidilecek bileşendir. Bu bileşen, aygıt donanımını kullanabilmeniz için bazı basit işlevler aracılığıyla yerel işletim sistemiyle iletişim kurmanıza yardımcı olur. Uygulamalarınızı yerel kod karmaşasına girmeden bu işlevler etrafında oluşturabilirsiniz. RNCamera zaten şunları desteklemektedir:

  • Fotoğraflar
  • videolar
  • Yüz tanıma
  • Barkod tarama
  • Metin tanıma (yalnızca Android)

RNCamera'nın eskiden iki çeşide sahip olduğunu unutmayın:

  1. RNKamera
  2. RTCCamera (kullanımdan kaldırıldı)

…bu yüzden en son güncellemeleri almaya devam edebilmek için RNCamera'yı kullandığınızdan emin olun.

Not: React Native Camera, ağırlıklı olarak Expo kamera modülüne dayalıdır ve ikisi arasında gidip gelmek oldukça kolaydır.

RNCamera Kullanarak İlk Uygulamanızı Oluşturma

React Native QR tarayıcımıza başlamadan önce, yüklememiz gereken bazı bağımlılıklar var.

RNCamera'nın Bağımlılıklarını Yükleme

Kurulumumuz minimum JDK sürüm 1.7'ye ihtiyaç duyar (büyük olasılıkla sahip olduğunuz) ve Android kullanıyorsanız, buildToolsVersion daha yeni buildToolsVersion gerekir. (Emin olun, belgelerde daha ayrıntılı ve güncel bir liste var.)

Öncelikle yeni bir React Native projesi oluşturarak başlayalım:

 react-native init CameraExample

Şimdi React Native Camera örneğimizin ilk sürümünü telefonumuza yerleştirelim.

 cd CameraExample react-native run-android

Aşağıdaki ekran görüntüsü gibi görünmelidir:

Bir React Native karşılama ekranını gösteren Android Emulator.

Şimdi projemize react-native-camera paketini kurmanın zamanı geldi. “Çoğunlukla yerel tepki ile otomatik yükleme” seçeneğini kullanacağız. (Çoğunlukla CocoaPods ile otomatik yükleme ve Elle yükleme gibi başkaları da vardır, ancak en verimlisi olduğu için ilk seçeneğe bağlı kalacağız.) Basitçe çalıştırın:

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

android/app/src/main/AndroidManifest.xml aşağıdaki izinleri de eklemelisiniz:

 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"

Ayrıca boyut stratejisini android/app/build.gradle ayarlamanız gerekir — varsayılanı yoktur ve tanımlamazsanız bir hata alırsınız:

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

Not: Boyut stratejisi normalde yukarıdaki gibi general olarak ayarlanmalıdır. Ancak, metin/yüz/barkod tanıma için MLKit'i kullanmak isterseniz, bunun yerine mlkit olarak ayarlayabilirsiniz.

Kurulumdan sonra, yeni bağımlılıkları kurmak için run-android kullanmanız gerekecek:

 react-native run-android

Her şey yolunda gittiyse, cihazınızda veya simülatörünüzde aynı React Native karşılama ekranını tekrar görmelisiniz.

Kamerayı Ayarlama

İlk olarak, App.js değiştirerek ve RNCamera buraya aktararak başlayalım:

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

Ardından, yeni içe aktarılan RNCamera içerecek şekilde render işlevini değiştireceğiz. Tam ekranı alabilmesi için kameraya eklenen style özelliğine dikkat edin. Bu stiller olmadan, herhangi bir yer kaplamadığı için kamera görüntüsünü ekranınızda göremeyebilirsiniz:

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

Bu kodu ekledikten sonra, arayüzünüz aşağıdaki ekran görüntüsünde olduğu gibi kamerayı tam ekran olarak açmalıdır:

Tam ekran kamera bileşenini gösteren bir ekran görüntüsü. Kamera, iki QR kod örneğini gösteren bir bilgisayar ekranına doğrultulur.

Artık barkodları görebiliyoruz (yukarıdaki monitörde test QR kodlarımızı gördüğümüz gibi) ancak henüz okuyamıyoruz. Her birinin içinde ne yazdığını tanımak için RNCamera'nın algoritmasını kullanalım.

Barkod Bilgilerini Okuma

Barkod bilgilerini okumak için onGoogleVisionBarcodesDetected kullanacağız, böylece bir fonksiyon çağırabilir ve bilgileri çıkarabiliriz. Bunu <RNCamera> bileşenine ekleyelim ve halletmek için onu bir barcodeRecognized işlevine bağlayalım. onGoogleVisionBarcodesDetected , kamerada tanınan tüm barkodların bir dizisini içeren barcodes özelliğini içeren bir nesne döndürdüğünü unutmayın.

Not: onGoogleVisionBarcodesDetected QR kod teknolojisi yalnızca Android'de kullanılabilir, ancak platformlar arası bir yaklaşım istiyorsanız onBarCodeRead daha iyi olur. Bir seferde yalnızca tek bir barkodu destekler; bunun bir geri dönüş olarak kullanılması okuyucu için bir alıştırma olarak bırakılır.

GoogleVisionBarcodesDetected öğesini ekledikten sonra <RNCamera> nasıl görünmesi gerektiği onGoogleVisionBarcodesDetected :

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

Ve artık App.js barkodları, yalnızca bir barkod algılandığında bizi uyaracak ve içeriğini ekranda göstermesi gereken aşağıdaki fonksiyonla işleyebiliriz:

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

İşte nasıl göründüğü:

Daha önce olduğu gibi aynı kamera açısı, şimdi altta konsol açılır pencereleri ile QR kodlarındaki mesajların kodu çözüldü: "Merhaba QR1" ve Toptal'ın web sitesi adresi.

Barkod Bindirmeleri Oluşturma

Bir önceki ekran görüntüsü artık barkodun içerdiği bilgileri gösteriyor ancak hangi mesajın hangi barkoda ait olduğunu bilmemize izin vermiyor. Bunun için onGoogleVisionBarcodesDetected döndürülen barcodes daha derinlemesine inceleyeceğiz ve ekranımızdaki barkodların her birini tam olarak belirlemeye çalışacağız.

Ancak önce, tanınan barkodları duruma kaydetmemiz gerekecek, böylece ona erişebilir ve içerilen verilere dayalı bir kaplama oluşturabiliriz. Şimdi daha önce tanımlanmış fonksiyonumuzu şöyle görünecek şekilde değiştireceğiz:

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

Şimdi, render işlevlerimizde herhangi bir hata oluşturmaması için boş bir barkod dizisine başlatılan bir state nesnesi eklememiz gerekecek:

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

Şimdi <RNCamera> bileşeninin içine eklenmesi gereken renderBarCodes işlevini oluşturalım:

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

Bu fonksiyon şimdi durumdan tanınan barkodları almalı ve ekranda göstermelidir:

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

Eşlemenin, ekranda her bir barkodu oluşturması gereken renderBarcode yönlendirildiğine dikkat edin. Bunları kolayca tanıyabilmemiz için bazı küçük stiller ekledim:

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

Tanınan her barkod şunları içerir:

  • Barkodun ekranımızın neresinde bulunduğunu bize bildiren ve bunun için kaplamayı oluşturmak için kullanacağımız bir bounds özelliği
  • Bize o belirli barkodda neyin kodlandığını gösteren bir data özelliği
  • Ne tür bir barkod olduğunu söyleyen bir type özelliği (2D, QR, vb.)

Bu üç parametreyi yukarıdaki render işlevinde olduğu gibi kullanmak aşağıdaki sonucu verir:

Yine aynı kamera açısı, bu sefer karşılık gelen QR kodlarının üzerine yerleştirilmiş kodu çözülmüş mesajlarla.

Platformlar Arası Dağıtım

Belirtildiği gibi, RNCamera kamera modülünün yerel parçalarını evrensel bir çapraz platform diline soyutlar. Bazı özelliklerin yalnızca bir platformda kullanılabileceğini veya başka bir platformda farklı şekilde yazılabileceğini belirtmek önemlidir. Oluşturmayı düşündüğünüz şeyin ihtiyaç duyduğunuz tüm platformlarda desteklendiğinden emin olmak için ilk adım olarak her zaman belgeleri okuduğunuzdan emin olun. Ayrıca, uygulamanızı tamamladıktan sonra uç durumları farklı cihazlarda test etmek her zaman daha iyidir, böylece ürününüzün sağlamlığından emin olursunuz.

İleri Git ve Kodunu Çöz

Umarım bu küçük artırılmış gerçeklik geliştirme tadı yardımcı olmuştur ve artık telefonunuzda veya simülatörünüzde çalışan temel React Native Camera uygulamasına sahipsiniz. Herhangi bir sorunuz veya isteğiniz varsa yorum bırakmaktan çekinmeyin!

İlgili: React Native'e Soğuk Bir Dalış (Yeni Başlayanlar İçin Eğitim)