本文概述
- 为什么要React Native?
- 什么是React Native Camera?
- 使用RNCamera创建你的第一个应用程序
- 跨平台部署
- 前进并解码
(注意:如果需要帮助进行设置, 可以随时参考React Native入门页面-不要忘记单击” React Native CLI快速入门” 按钮, 因为当时已预先选择了” Expo CLI快速入门” 撰写本文)。
为什么要React Native? React Native是一个有价值的框架, 它借鉴了React的范式和设计原则来实现快速, 跨平台的易用UI的开发。 Facebook, Airbnb, Uber和许多其他公司已经使用React Native构建了他们的最新应用程序。
什么是React Native Camera? 当涉及在React Native应用中实现相机功能时, React Native Camera(RNCamera)是必不可少的组件。该组件可帮助你通过一些简单功能与本机OS通信, 以便你可以使用设备硬件。你可以围绕这些功能构建应用程序, 而不必担心本机代码的麻烦。 RNCamera已经支持:
- 摄影作品
- 影片
- 人脸检测
- 条码扫描
- 文字识别(仅适用于Android)
- RNCamera
- RCTCamera(已弃用)
注意:React Native Camera很大程度上基于Expo相机模块, 在两者之间来回切换非常容易。
使用RNCamera创建你的第一个应用程序 在开始我们的React Native QR扫描仪之前, 需要安装一些依赖项。
安装RNCamera的依存关系
我们的设置至少需要JDK 1.7版(你很可能已经拥有), 并且如果你使用的是Android, 则需要buildToolsVersion高于25.0.2。 (可以肯定的是, 文档中有更详细和最新的列表。)
首先, 我们先创建一个新的React Native项目:
react-native init CameraExample
现在, 让我们在手机上部署React Native Camera示例的第一个版本。
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"
注意:尺寸策略通常应如上所述设置为常规。但是, 如果你想将MLKit用于文本/面部/条形码识别, 则可以将其设置为mlkit。
安装后, 你将需要使用run-android安装新的依赖项:
react-native run-android
如果一切顺利, 你应该在设备或模拟器上再次看到相同的React Native欢迎屏幕。
设置相机
首先, 我们先修改App.js并在其中导入RNCamera:
import { RNCamera } from 'react-native-camera';
接下来, 我们将修改渲染功能以包括我们新导入的RNCamera。请注意, 已将样式属性添加到摄像机以使其全屏显示。没有这些样式, 你可能无法在屏幕上看到相机渲染的图像, 因为它不会占据任何空间:
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返回一个包含条形码属性的对象, 该属性包含相机中识别出的所有条形码的数组。
注意:onGoogleVisionBarcodesDetected QR码技术仅在Android上可用, 但是如果你希望使用跨平台方法, 则最好使用onBarCodeRead。它一次仅支持一个条形码-将其用作后备留给读者练习。
添加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返回的条形码, 并尝试在屏幕上查明每个条形码。
但是首先, 我们需要将识别出的条形码保存到状态中, 以便我们可以访问它并根据所包含的数据渲染覆盖图。现在, 我们将修改先前定义的函数, 如下所示:
barcodeRecognized = ({ barcodes }) =>
this.setState({ barcodes });
现在, 我们需要添加一个初始化为空条形码数组的状态对象, 以免在渲染函数中产生任何错误:
export default class App extends Component<
Props>
{
state = {
barcodes: [], }
// ...
现在创建创建renderBarCodes函数, 该函数应添加到< RNCamera> 组件内部:
<
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属性, 用于告诉我们在屏幕上的何处找到了条形码, 我们将使用该条形码渲染条形码的叠加层
- 数据属性, 向我们显示特定条形码中的编码
- 一个类型属性, 告诉我们它是哪种条形码(2D, QR等)
文章图片
跨平台部署 如前所述, RNCamera将摄影机模块的本机部分抽象为通用的跨平台语言。请务必注意, 某些功能仅在一个平台上可用, 或者它们在另一平台上的书写方式可能不同。为确保所需的所有平台都支持要构建的内容, 请务必始终阅读文档。此外, 实施完后最好在不同设备上测试边缘情况, 以确保产品的坚固性。
前进并解码 我希望对增强现实开发的这种小尝试会有所帮助, 并且你现在已经在手机或模拟器上运行了基本的React Native Camera应用程序。如有任何疑问或要求, 请随时发表评论!
【构建QR扫描仪(React Native Camera教程)】相关:深入研究React Native(初学者教程)
推荐阅读
- Monorepos前端代码指南
- Flutter教程(如何创建你的第一个Flutter应用)
- 如何在iOS中实现T9搜索
- 如何从头开始创建可滑动的UITabBar
- 在React Native中使用Redux,RxJS和Redux-Observable构建响应式应用程序
- 避免iOS和Android设计中的不良做法
- 保持加密,确保安全(使用ESNI,DoH和DoT)