mrousavy / react-native-vision-camera

📸 A powerful, high-performance React Native Camera library.
https://react-native-vision-camera.com
MIT License
6.89k stars 1.02k forks source link

🐛 Crash in Android release build #2999

Open malkawi00 opened 1 week ago

malkawi00 commented 1 week ago

What's happening?

when I try to run the app from react native metro work fine , but when I make release APK , I have an issue app crash when open the camera , is there any solution

Reproduceable Code

export const CustomCamera = forwardRef((props, ref) => {
  const {
    isVisible = false,
    frameProcessor = null,
    cameraType = 'back',
    zoom = 1,
    torch = 'off',
  } = props;
  const device = useCameraDevice(cameraType);
  if (device == null) {
    return (
      <View style={styles.loadingView}>
        <Text style={styles.loadingText}>Loading</Text>
      </View>
    );
  }
  return (
    <Camera
      device={device}
      isActive={isVisible}
      zoom={zoom}
      style={EStyleSheet.absoluteFill}
      frameProcessor={frameProcessor}
      ref={ref}
      pixelFormat={'yuv'}
      photo={true}
      video={true}
      torch={isVisible ? torch : 'off'}
      photoQualityBalance="balanced">
      {props.children}
    </Camera>
  );
});

this code use custom camera 
 const frameLogicJS = Worklets.createRunOnJS((scannedData, type) => {
    const result = scannedData.data || {};
    setSdkResult(scannedData);

    // console.log('scannedData--', JSON.stringify(scannedData, null, 2));

  });

const frameProcessor = useFrameProcessor(
    frame => {
      'worklet';
      runAsync(frame, () => {
        'worklet';
        runAtTargetFps(60, () => {
          'worklet';
          let scannedData = scanDocument(frame);
          if (isFrontFrameProcessor.value) {
            frameLogicJS(scannedData, 'front');
          } else {
            frameLogicJS(scannedData, 'back');
          }
        });
      });
    },
    [isFrontFrameProcessor],
  );
I try to remove runAsync it work fine but with lag in camera 

const frameProcessor = useFrameProcessor(
    frame => {
      'worklet';
        let scannedData = scanDocument(frame);
        if (isFrontFrameProcessor.value) {
          frameLogicJS(scannedData, 'front');
        } else {
          frameLogicJS(scannedData, 'back');
        }
    },
    [isFrontFrameProcessor],
  );

Relevant log output

"react-native-vision-camera": "4.3.1",
"react-native-worklets-core": "^1.3.3",
Failed to acquire image.
                                                                                                    java.lang.IllegalStateException: maxImages (6) has already been acquired, call #close before acquiring more.
                                                                                                        at android.media.ImageReader.acquireNextImage(ImageReader.java:661)
                                                                                                        at androidx.camera.core.AndroidImageReaderProxy.acquireNextImage(AndroidImageReaderProxy.java:88)
                                                                                                        at androidx.camera.core.SafeCloseImageReaderProxy.acquireNextImage(SafeCloseImageReaderProxy.java:88)
                                                                                                        at androidx.camera.core.ImageAnalysisBlockingAnalyzer.acquireImage(ImageAnalysisBlockingAnalyzer.java:41)
                                                                                                        at androidx.camera.core.ImageAnalysisAbstractAnalyzer.onImageAvailable(ImageAnalysisAbstractAnalyzer.java:128)
                                                                                                        at androidx.camera.core.SafeCloseImageReaderProxy.lambda$setOnImageAvailableListener$1$androidx-camera-core-SafeCloseImageReaderProxy(SafeCloseImageReaderProxy.java:213)
                                                                                                        at androidx.camera.core.SafeCloseImageReaderProxy$$ExternalSyntheticLambda1.onImageAvailable(Unknown Source:4)
                                                                                                        at androidx.camera.core.AndroidImageReaderProxy.lambda$setOnImageAvailableListener$0$androidx-camera-core-AndroidImageReaderProxy(AndroidImageReaderProxy.java:169)
                                                                                                        at androidx.camera.core.AndroidImageReaderProxy$$ExternalSyntheticLambda0.run(Unknown Source:4)

Camera Device

{
  "formats": [],
  "sensorOrientation": "landscape-left",
  "hardwareLevel": "full",
  "maxZoom": 10,
  "minZoom": 0.6000000238418579,
  "maxExposure": 20,
  "supportsLowLightBoost": false,
  "neutralZoom": 1,
  "physicalDevices": [
    "wide-angle-camera",
    "ultra-wide-angle-camera",
    "wide-angle-camera",
    "telephoto-camera"
  ],
  "supportsFocus": true,
  "supportsRawCapture": false,
  "isMultiCam": true,
  "minFocusDistance": 0,
  "minExposure": -20,
  "name": "0 (BACK) androidx.camera.camera2",
  "hasFlash": true,
  "hasTorch": true,
  "position": "back",
  "id": "0"
}

Device

Samsung s23 , OPPO A5s , Honor 90 REA-NX9

VisionCamera Version

4.3.1

Can you reproduce this issue in the VisionCamera Example app?

I didn't try (⚠️ your issue might get ignored & closed if you don't try this)

Additional information

maintenance-hans[bot] commented 1 week ago

Guten Tag, Hans here.

[!NOTE] New features, bugfixes, updates and other improvements are all handled mostly by @mrousavy in his free time. To support @mrousavy, please consider 💖 sponsoring him on GitHub 💖. Sponsored issues will be prioritized.

aguedob commented 1 week ago

Why are you nesting runAsync with runAtTargetFps? I think you should use one or the other.

malkawi00 commented 1 week ago

@aguedob if I use runAsync without runAtTargetFps the camera lagging

nameishuy commented 5 days ago

Hi, It's not related much. But I got this issues on Android. Anyone know how to fix it ?

my version package: 4.3.2 react native version: 0.73

Fatal Exception: java.lang.UnsatisfiedLinkError: dlopen failed: library "libVisionCamera.so" not found
       at java.lang.Runtime.loadLibrary0(Runtime.java:1087)
       at java.lang.Runtime.loadLibrary0(Runtime.java:1008)
       at java.lang.System.loadLibrary(System.java:1664)
       at com.mrousavy.camera.react.CameraViewModule.<clinit>(CameraViewModule.kt:48)
       at com.mrousavy.camera.react.CameraPackage.createNativeModules(CameraPackage.kt:11)
       at com.facebook.react.ReactPackageHelper.getNativeModuleIterator(ReactPackageHelper.java:43)
       at com.facebook.react.NativeModuleRegistryBuilder.processPackage(NativeModuleRegistryBuilder.java:42)
       at com.facebook.react.ReactInstanceManager.processPackage(ReactInstanceManager.java:1458)
       at com.facebook.react.ReactInstanceManager.processPackages(ReactInstanceManager.java:1429)
       at com.facebook.react.ReactInstanceManager.createReactContext(ReactInstanceManager.java:1331)
       at com.facebook.react.ReactInstanceManager.lambda$runCreateReactContextOnNewThread$2(ReactInstanceManager.java:1101)
       at com.facebook.react.ReactInstanceManager.$r8$lambda$AwGS8CysOZmWJw3kRVARHQvw9Ew()
       at com.facebook.react.ReactInstanceManager$$ExternalSyntheticLambda5.run(:4)
       at java.lang.Thread.run(Thread.java:923)
mrousavy commented 5 days ago

Why are you nesting runAsync with runAtTargetFps? I think you should use one or the other.

No you can also nest them.