如何使用 Android Java Camera View 模块创建自定义 React Native 组件?

Posted

技术标签:

【中文标题】如何使用 Android Java Camera View 模块创建自定义 React Native 组件?【英文标题】:How to create a custom React Native component with Android Java Camera View module? 【发布时间】:2020-05-01 02:27:22 【问题描述】:

我正在尝试为增强现实目的构建一个 react-native android 应用程序,我需要在屏幕上显示实时摄像头预览。所以我正在尝试制作自己的 Android 相机组件,而不是使用 React Native 的默认 react-native-camera 包。这是因为我需要一个摄像头模块,它可以让我实时获取摄像头帧,检测 Aruco 标记,在图像帧上绘图,并将其显示在 react-native 的摄像头预览中。 因此,通过阅读教程和文章,我尝试创建一个视图管理器类和一个 ReactPackage 类来桥接我的 Android 相机视图。仅供参考,CameraBridgeViewBase 类是扩展 SurfaceView 的 OpenCV 类,可在此库中找到:https://github.com/quickbirdstudios/opencv-android/tree/master/opencv3_4_4_contrib

当我运行该应用程序时,我只是一直黑屏,没有相机预览。在创建视图之前,我确实授予了相机权限。如果有任何建议或任何在这方面有经验的人可以提供帮助。非常感谢,谢谢。

查看管理器类:

public class JavaCameraViewManager extends SimpleViewManager<CameraBridgeViewBase> implements CameraBridgeViewBase.CvCameraViewListener2 

    public static final String REACT_CLASS = "JavaCameraView";
    public CameraBridgeViewBase javaCameraView;

    @Override
    public String getName() 
        return REACT_CLASS;
    

    @Override
    protected CameraBridgeViewBase createViewInstance(ThemedReactContext reactContext) 
        javaCameraView = new JavaCameraView(reactContext, null);
        javaCameraView.setVisibility(SurfaceView.VISIBLE);
        javaCameraView.setCvCameraViewListener(this);
        return javaCameraView;
    

    @Override
    public void onCameraViewStarted(int width, int height)

    @Override
    public void onCameraViewStopped()

    @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame)
        System.out.println("onCameraFrame$");
        return inputFrame.rgba();
    


React 包类:

public class JavaCameraViewPackage implements ReactPackage 

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) 
        return Collections.emptyList();
    
    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) 
        return Collections.<ViewManager>singletonList(
                new JavaCameraViewManager()
        );
    

React Native Camera View 组件类:

import React,  Component  from 'react'
import  requireNativeComponent from 'react-native';

const JavaCameraView = requireNativeComponent('JavaCameraView', JavaCameraViewView);

export default class JavaCameraViewView extends Component 
    render () 
      return <JavaCameraView ...this.props />
    
  

App.js:

'use strict';
import React, Component from 'react';
import Platform, StyleSheet, Text, View from 'react-native';
import  NativeModules, AppRegistry, TouchableOpacity from 'react-native';
import JavaCameraView from './src/JavaCameraViewNativeView'

export default class App extends Component  

  render() 
    return (
      <View style=styles.container>
        <JavaCameraView style= flex: 1, width: '100%', height: '100%', backgroundColor:'blue' /> 
      </View>
    );
  


【问题讨论】:

你设法让它工作了吗? 是的,我已经让它工作了。将发布解决方案 【参考方案1】:

我找到了一个 opencv 项目,它有一个关于如何设置 android openCV java 摄像头预览以桥接反应本机的解决方案。查看https://github.com/RobertSasak/react-native-openalpr

【讨论】:

【参考方案2】:

如果您再添加几行代码,应该能够使其正常工作。 我已经在一个博览会(SDK 44)裸工作流项目上使用 OpenCV v4.5.4 和 v3.4.10 对此进行了测试。我在使用 OpenCV v4.5.4 的 onCameraFrame 函数中的 Impgroc 函数遇到了一些错误,并且自从降级到 v3.4.10 后没有任何问题。

// Class should extend SimpleViewManager<JavaCameraView>
public class JavaCameraViewManager extends SimpleViewManager<JavaCameraView> implements CameraBridgeViewBase.CvCameraViewListener2 
    ...
    // public CameraBridgeViewBase javaCameraView;
    public JavaCameraView javaCameraView;
    ...
    @Override
    public JavaCameraView createViewInstance(ThemedReactContext reactContext)  
        javaCameraView = new JavaCameraView(reactContext, -1);
        javaCameraView.setCvCameraViewListener(this);
        // javaCameraView.setCameraPermissionGranted(); // Only required on newer versions of OpenCV
        javaCameraView.enableView();
        return javaCameraView;
    
    ...

您还应确保根据您的需要在 AndroidManifest.xml 中授予相机权限

  <!-- Camera & mic & flashlight permissions -->
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  <uses-permission android:name="android.permission.FLASHLIGHT" />

希望这可以帮助任何努力设置它的人。

【讨论】:

以上是关于如何使用 Android Java Camera View 模块创建自定义 React Native 组件?的主要内容,如果未能解决你的问题,请参考以下文章

android Camera如何判断当前使用的摄像头是前置还是后置

android Camera 如何判断当前使用的摄像头是前置还是后置

android从应用到驱动之—camera---程序调用流程(转)

如何使用未指定输出大小的 com.android.camera.action.CROP?

如何实现RTMP推送Android Camera2数据

如何在 Android 上的 Camera 使用的 SurfaceView 上绘制叠加层?