I am trying to build a react-native android app for augmented reality purposes which I need a live camera preview displayed on the screen. So I'm trying to make my own Android camera component instead of using React Native's default react-native-camera package. This is because I need a camera module that would allow me to get camera frames in real time, detect Aruco markers, draw on the image frame, and display it on a camera preview in react-native. So from reading tutorials and articles, I've attempted to create a view manager class and a ReactPackage class to bridge my Android camera view. FYI the CameraBridgeViewBase class is an OpenCV class which extends SurfaceView, which is found in this library: https://github.com/quickbirdstudios/opencv-android/tree/master/opencv3_4_4_contrib
When I run the app, I just keep getting a black screen with no camera preview. I did have camera permissions granted before the view gets created. If there is any suggestions or anyone who has experience in this area that could help. I would greatly appreciate, Thanks.
View Manager Class:
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 Package class:
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 Component class:
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>
);
}
}