react-native-vision-camera icon indicating copy to clipboard operation
react-native-vision-camera copied to clipboard

🐛 Android 3.9.0-beta.3 codeScanner crash still

Open podger opened this issue 1 year ago • 1 comments

What's happening?

I'm dealing with this error non stop since version 3.x. On 3.8.1 I found a workaround putting IsActive false immediately in the the codeScanner callback and destroying the view with a setTimeout (showCamera = false). Without doing this the camera would crash with an ML kit error very often.

On 3.8.1 I had some black screen issuers reports, so I decided to try this 3.9.0-beta.3 version. Crash on code scanner is back on with both methods: deactivating first and destroying the view with a delay or destroy directly on receiving the code scanner. The error in the log is different tough. No more ML kit involved and it's also less frequent (at least on my device).

What I noticed is that the crashes happen while trying to dismiss the camera in the codeScanner callback, If I omit the closing camera code it never crashes (as the example app) neither dismissing it with a custom button. Basically it's the combo: Code Scanned Event + Dismiss camera that goes wrong.

Reproduceable Code

{showCamera && authorizationCamera == "granted" && !!currentCamera && (
                <View className='w-full h-full'>
                    <Camera
                        className='w-full h-full'
                        ref={camera}
                        device={currentCamera}
                        isActive={isAppForeground && isFocused}
                        enableZoomGesture={false}
                        codeScanner={codeScanner}
                    />
                    <View className='flex-row items-center justify-around absolute bottom-2 left-0 w-full py-14 z-50'>
                       ˙ <TouchableOpacity className="rounded-full bg-white w-14 h-14 p-2 items-center" onPress={() => onCurrentDismiss()}>
                            <FontIcon size={40} name="times" color={'black'} ></FontIcon>
                        </TouchableOpacity>
                    </View>

                </View>

Relevant log output

8545-8677  Persistent...ureSession com.myapp                    I  Creating new device...
2024-02-14 08:58:57.751  8545-8677  CameraManager           com.myapp                    I  Camera #0: Opening...
2024-02-14 08:58:57.752  8545-9259  DynamiteModule          com.myapp                    I  Considering local module com.google.mlkit.dynamite.barcode:10000 and remote module com.google.mlkit.dynamite.barcode:0
2024-02-14 08:58:57.752  8545-9259  DynamiteModule          com.myapp                    I  Selected local version of com.google.mlkit.dynamite.barcode
2024-02-14 08:58:57.756  8545-8545  CameraSession           com.myapp                    I  PreviewView Surface created! Surface(name=null)/@0xf7c8df0
2024-02-14 08:58:57.756  8545-8545  CameraSession           com.myapp                    I  Setting Preview Output...
2024-02-14 08:58:57.756  8545-8545  CameraSession           com.myapp                    I  PreviewView Surface updated! Surface(name=null)/@0xf7c8df0 1240 x 2205
2024-02-14 08:58:57.802  8545-8680  CameraDevices           com.myapp                    I  Camera #0 is now unavailable.
2024-02-14 08:58:57.804  8545-8677  CameraSession           com.myapp                    I  configure { ... }: Waiting for lock...
2024-02-14 08:58:57.804  8545-8678  CameraManager           com.myapp                    I  Camera #0: Opened!
2024-02-14 08:58:57.804  8545-8677  CameraSession           com.myapp                    I  configure { ... }: Waiting for lock...
2024-02-14 08:58:57.804  8545-8677  Persistent...ureSession com.myapp                    I  Creating new session...
2024-02-14 08:58:57.807  8545-8677  CreateCaptureSession    com.myapp                    I  Camera #0: Creating Capture Session #7... (Hardware Level: 1 | Outputs: [VIDEO (1280 x 720 CodeScanner for [QR] (35))])
2024-02-14 08:58:57.807  8545-8677  SurfaceOutput           com.myapp                    I  Using optimized stream use case 3 for VIDEO output.
2024-02-14 08:58:57.807  8545-8677  CreateCaptureSession    com.myapp                    I  Using new API (>=28)
2024-02-14 08:58:57.827  8545-8678  CreateCaptureSession    com.myapp                    I  Camera #0: Successfully created CameraCaptureSession #7!
2024-02-14 08:58:57.828  8545-8677  Persistent...ureSession com.myapp                    D  Stopping repeating request...
2024-02-14 08:58:57.828  8545-8677  Persistent...ureSession com.myapp                    D  Configure() done! isActive: false, ID: 0, device: android.hardware.camera2.impl.CameraDeviceImpl@80c28f, session: android.hardware.camera2.impl.CameraCaptureSessionImpl@bb4991c
2024-02-14 08:58:57.828  8545-8677  CameraSession           com.myapp                    I  configure { ... }: Completed CameraSession Configuration! (isActive: false, isRunning: false)
2024-02-14 08:58:57.828  8545-8677  CameraView              com.myapp                    I  invokeOnInitialized()
2024-02-14 08:58:57.830  8545-8677  CameraSession           com.myapp                    I  configure { ... }: Updating CameraSession Configuration... Difference(deviceChanged=false, outputsChanged=false, sidePropsChanged=false, isActiveChanged=true)
2024-02-14 08:58:57.830  8545-8677  Persistent...ureSession com.myapp                    D  --> setIsActive(false)
2024-02-14 08:58:57.831  8545-8677  Persistent...ureSession com.myapp                    D  Configure() with isActive: false, ID: 0, device: android.hardware.camera2.impl.CameraDeviceImpl@80c28f, session: android.hardware.camera2.impl.CameraCaptureSessionImpl@bb4991c
2024-02-14 08:58:57.832  8545-8677  Persistent...ureSession com.myapp                    D  Stopping repeating request...
2024-02-14 08:58:57.832  8545-8677  Persistent...ureSession com.myapp                    D  Configure() done! isActive: false, ID: 0, device: android.hardware.camera2.impl.CameraDeviceImpl@80c28f, session: android.hardware.camera2.impl.CameraCaptureSessionImpl@bb4991c
2024-02-14 08:58:57.832  8545-8677  CameraSession           com.myapp                    I  configure { ... }: Completed CameraSession Configuration! (isActive: true, isRunning: false)
2024-02-14 08:58:57.832  8545-8677  CameraSession           com.myapp                    I  configure { ... }: Updating CameraSession Configuration... Difference(deviceChanged=false, outputsChanged=true, sidePropsChanged=true, isActiveChanged=true)
2024-02-14 08:58:57.832  8545-8677  CameraSession           com.myapp                    I  Destroying previous outputs...
2024-02-14 08:58:57.832  8545-8677  SurfaceOutput           com.myapp                    I  Closing BarcodeScanner..
2024-02-14 08:58:57.834  8545-8677  CameraSession           com.myapp                    I  Creating outputs for Camera #0...
2024-02-14 08:58:57.841  8545-8677  CameraSession           com.myapp                    I  Adding 1920x1080 Preview Output...
2024-02-14 08:58:57.841  8545-8545  PreviewView             com.myapp                    I  Setting PreviewView Surface Size to 1920x1080...
2024-02-14 08:58:57.842  8545-8545  SurfaceHolder           com.myapp                    I  Resizing SurfaceHolder to 1920 x 1080...
2024-02-14 08:58:57.853  8545-8545  CameraSession           com.myapp                    I  PreviewView Surface updated! Surface(name=null)/@0xf7c8df0 1920 x 1080
2024-02-14 08:58:57.853  8545-8545  SurfaceHolder           com.myapp                    I  Resized SurfaceHolder to 1920 x 1080!
2024-02-14 08:58:57.859  8545-8677  CameraSession           com.myapp                    I  Adding 1280x720 CodeScanner Output in YUV_420_888...
2024-02-14 08:58:57.860  8545-9206  DynamiteModule          com.myapp                    I  Considering local module com.google.mlkit.dynamite.barcode:10000 and remote module com.google.mlkit.dynamite.barcode:0
2024-02-14 08:58:57.860  8545-9206  DynamiteModule          com.myapp                    I  Selected local version of com.google.mlkit.dynamite.barcode
2024-02-14 08:58:57.860  8545-8677  Persistent...ureSession com.myapp                    D  --> setOutputs([PREVIEW (1920 x 1080), VIDEO (1280 x 720 CodeScanner for [QR] (35))])
2024-02-14 08:58:57.860  8545-8677  CameraSession           com.myapp                    I  Successfully configured Session with 2 outputs for Camera #0!
2024-02-14 08:58:57.860  8545-8677  Persistent...ureSession com.myapp                    D  --> setRepeatingRequest(...)
2024-02-14 08:58:57.860  8545-8677  Persistent...ureSession com.myapp                    D  --> setIsActive(true)
2024-02-14 08:58:57.860  8545-8677  Persistent...ureSession com.myapp                    D  Configure() with isActive: true, ID: 0, device: android.hardware.camera2.impl.CameraDeviceImpl@80c28f, session: null
2024-02-14 08:58:57.860  8545-8677  Persistent...ureSession com.myapp                    I  Creating new session...
2024-02-14 08:58:57.862  8545-8677  CreateCaptureSession    com.myapp                    I  Camera #0: Creating Capture Session #8... (Hardware Level: 1 | Outputs: [PREVIEW (1920 x 1080), VIDEO (1280 x 720 CodeScanner for [QR] (35))])
2024-02-14 08:58:57.863  8545-8677  SurfaceOutput           com.myapp                    I  Using optimized stream use case 1 for PREVIEW output.
2024-02-14 08:58:57.863  8545-8677  SurfaceOutput           com.myapp                    I  Using optimized stream use case 3 for VIDEO output.
2024-02-14 08:58:57.863  8545-8677  CreateCaptureSession    com.myapp                    I  Using new API (>=28)
2024-02-14 08:58:57.863  8545-8678  CreateCaptureSession    com.myapp                    I  Camera #0: CameraCaptureSession #7 has been closed.
2024-02-14 08:58:57.863  8545-8678  Persistent...ureSession com.myapp                    I  Session android.hardware.camera2.impl.CameraCaptureSessionImpl@bb4991c closed!
2024-02-14 08:58:57.942  8545-8572  BpBinder                com.myapp                    I  onLastStrongRef automatically unlinking death recipients: 
2024-02-14 08:58:57.943  8545-8678  CreateCaptureSession    com.myapp                    I  Camera #0: Successfully created CameraCaptureSession #8!
2024-02-14 08:58:57.943  8545-8677  Persistent...ureSession com.myapp                    D  Updating repeating request...
2024-02-14 08:58:57.954  8545-8677  Persistent...ureSession com.myapp                    D  Configure() done! isActive: true, ID: 0, device: android.hardware.camera2.impl.CameraDeviceImpl@80c28f, session: android.hardware.camera2.impl.CameraCaptureSessionImpl@15ef2a1
2024-02-14 08:58:57.954  8545-8677  CameraSession           com.myapp                    I  configure { ... }: Completed CameraSession Configuration! (isActive: true, isRunning: true)
2024-02-14 08:58:57.955  8545-8677  CameraView              com.myapp                    I  invokeOnStarted()
2024-02-14 08:58:58.083  8545-9215  tflite                  com.myapp                    I  Replacing 43 out of 43 node(s) with delegate (TfLiteXNNPackDelegate) node, yielding 1 partitions for the whole graph.
2024-02-14 08:58:58.084  8545-9215  tflite                  com.myapp                    I  Replacing 42 out of 47 node(s) with delegate (TfLiteXNNPackDelegate) node, yielding 11 partitions for the whole graph.
2024-02-14 08:58:58.084  8545-9215  native                  com.myapp                    I  I0000 00:00:1707897538.084909    9215 oned_decoder_client.cc:695] barhopper::deep_learning::OnedDecoderClient is created successfully.
2024-02-14 08:58:58.337  8545-8545  CameraSession           com.myapp                    I  PreviewView Surface destroyed! Surface(name=null)/@0xf7c8df0
2024-02-14 08:58:58.338  8545-8545  CameraSession           com.myapp                    I  Destroying Preview Output...
2024-02-14 08:58:58.338  8545-8545  CameraSession           com.myapp                    I  configure { ... }: Waiting for lock...
2024-02-14 08:58:58.338  8545-8545  CameraSession           com.myapp                    I  configure { ... }: Updating CameraSession Configuration... Difference(deviceChanged=false, outputsChanged=true, sidePropsChanged=true, isActiveChanged=true)
2024-02-14 08:58:58.338  8545-8545  CameraSession           com.myapp                    I  Destroying previous outputs...
2024-02-14 08:58:58.338  8545-8545  SurfaceOutput           com.myapp                    I  Closing BarcodeScanner..
2024-02-14 08:58:58.339  8545-8545  CameraView              com.myapp                    I  invokeOnStopped()
2024-02-14 08:58:58.362  8545-8572  BufferQueueProducer     com.myapp                    E  [ImageReader-1280x720f23m2-8545-7](id:216100000012,api:4,p:1139,c:8545) dequeueBuffer: BufferQueue has been abandoned
2024-02-14 08:58:58.365  8545-8545  CameraSession           com.myapp                    I  Creating outputs for Camera #0...
2024-02-14 08:58:58.366  8545-8572  BufferQueueProducer     com.myapp                    E  [ImageReader-1280x720f23m2-8545-7](id:216100000012,api:4,p:1139,c:8545) queueBuffer: BufferQueue has been abandoned
2024-02-14 08:58:58.370  8545-8545  CameraSession           com.myapp                    I  Adding 1280x720 CodeScanner Output in YUV_420_888...
2024-02-14 08:58:58.371  8545-8545  Persistent...ureSession com.myapp                    D  --> setOutputs([VIDEO (1280 x 720 CodeScanner for [QR] (35))])
2024-02-14 08:58:58.508  8545-8545  CameraSession           com.myapp                    I  Successfully configured Session with 1 outputs for Camera #0!
2024-02-14 08:58:58.508  8545-8545  Persistent...ureSession com.myapp                    D  --> setRepeatingRequest(...)
2024-02-14 08:58:58.508  8545-8545  Persistent...ureSession com.myapp                    D  --> setIsActive(false)
2024-02-14 08:58:58.508  8545-8545  Persistent...ureSession com.myapp                    D  Configure() with isActive: false, ID: 0, device: android.hardware.camera2.impl.CameraDeviceImpl@80c28f, session: null
2024-02-14 08:58:58.509  8545-8545  Persistent...ureSession com.myapp                    I  Creating new session...
2024-02-14 08:58:58.511  8545-8545  CreateCaptureSession    com.myapp                    I  Camera #0: Creating Capture Session #9... (Hardware Level: 1 | Outputs: [VIDEO (1280 x 720 CodeScanner for [QR] (35))])
2024-02-14 08:58:58.511  8545-8545  SurfaceOutput           com.myapp                    I  Using optimized stream use case 3 for VIDEO output.
2024-02-14 08:58:58.511  8545-8545  CreateCaptureSession    com.myapp                    I  Using new API (>=28)
2024-02-14 08:58:58.511  8545-8678  CreateCaptureSession    com.myapp                    I  Camera #0: CameraCaptureSession #8 has been closed.
2024-02-14 08:58:58.511  8545-8678  Persistent...ureSession com.myapp                    I  Session android.hardware.camera2.impl.CameraCaptureSessionImpl@15ef2a1 closed!
2024-02-14 08:58:58.543  8545-9259  libc                    com.myapp                    A  Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x78c1bebadc in tid 9259 (pool-23-thread-), pid 8545 (m.beesworkerapp)
2024-02-14 08:58:58.596  8545-8678  CreateCaptureSession    com.myapp                    I  Camera #0: Successfully created CameraCaptureSession #9!
2024-02-14 08:58:58.597  8545-8545  Persistent...ureSession com.myapp                    D  Stopping repeating request...
2024-02-14 08:58:58.597  8545-8545  Persistent...ureSession com.myapp                    D  Configure() done! isActive: false, ID: 0, device: android.hardware.camera2.impl.CameraDeviceImpl@80c28f, session: android.hardware.camera2.impl.CameraCaptureSessionImpl@5036098
2024-02-14 08:58:58.598  8545-8545  CameraSession           com.myapp                    I  configure { ... }: Completed CameraSession Configuration! (isActive: true, isRunning: false)
2024-02-14 08:58:58.598  8545-8545  CameraSession           com.myapp                    I  Preview Output destroyed!
2024-02-14 08:58:58.601  8545-8545  CameraView              com.myapp                    I  Updating CameraSession...
2024-02-14 08:58:58.602  8545-8677  CameraSession           com.myapp                    I  configure { ... }: Waiting for lock...
2024-02-14 08:58:58.602  8545-8677  CameraSession           com.myapp                    I  configure { ... }: Updating CameraSession Configuration... Difference(deviceChanged=false, outputsChanged=false, sidePropsChanged=false, isActiveChanged=true)
2024-02-14 08:58:58.602  8545-8677  Persistent...ureSession com.myapp                    D  --> setIsActive(false)
2024-02-14 08:58:58.602  8545-8677  Persistent...ureSession com.myapp                    D  Configure() with isActive: false, ID: 0, device: android.hardware.camera2.impl.CameraDeviceImpl@80c28f, session: android.hardware.camera2.impl.CameraCaptureSessionImpl@5036098
2024-02-14 08:58:58.602  8545-8545  CameraSession           com.myapp                    I  Closing CameraSession...
2024-02-14 08:58:58.602  8545-8677  Persistent...ureSession com.myapp                    D  Stopping repeating request...
2024-02-14 08:58:58.603  8545-8677  Persistent...ureSession com.myapp                    D  Configure() done! isActive: false, ID: 0, device: android.hardware.camera2.impl.CameraDeviceImpl@80c28f, session: android.hardware.camera2.impl.CameraCaptureSessionImpl@5036098
2024-02-14 08:58:58.603  8545-8677  CameraSession           com.myapp                    I  configure { ... }: Completed CameraSession Configuration! (isActive: false, isRunning: false)
2024-02-14 08:58:58.603  8545-8545  CameraSession           com.myapp                    I  Destroying session..
2024-02-14 08:58:58.675  8545-8573  BpBinder                com.myapp                    I  onLastStrongRef automatically unlinking death recipients: 
2024-02-14 08:58:58.706  8545-8680  CameraDevices           com.myapp                    I  Camera #0 is now available.
2024-02-14 08:58:58.706  8545-8545  SurfaceOutput           com.myapp                    I  Closing BarcodeScanner..
2024-02-14 08:58:58.707  8545-8545  CameraSession           com.myapp                    I  CameraSession closed!
2024-02-14 08:59:47.945  9668-9668  ziparchive              com.myapp                    W  Unable to open '/data/app/~~ki1p87rcf9zuUGkT_bjH8g==/com.myapp-_n1Zzq1-PEZ3FCi95dgH1A==/base.dm': No such file or directory
2024-02-14 08:59:47.945  9668-9668  ziparchive              com.myapp                    W  Unable to open '/data/app/~~ki1p87rcf9zuUGkT_bjH8g==/com.myapp-_n1Zzq1-PEZ3FCi95dgH1A==/base.dm': No such file or directory

Camera Device

LOG  {
  "formats": [],
  "sensorOrientation": "landscape-left",
  "hardwareLevel": "full",
  "maxZoom": 8,
  "minZoom": 0.5490683317184448,
  "maxExposure": 24,
  "supportsLowLightBoost": true,
  "neutralZoom": 1,
  "physicalDevices": [
    "wide-angle-camera",
    "ultra-wide-angle-camera",
    "telephoto-camera"
  ],
  "supportsFocus": true,
  "supportsRawCapture": true,
  "isMultiCam": true,
  "minFocusDistance": 10.500000100135805,
  "minExposure": -24,
  "name": "BACK (0)",
  "hasFlash": true,
  "hasTorch": true,
  "position": "back",
  "id": "0"
}

Device

Pixel 8

VisionCamera Version

3.9.0-beta.3

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

podger avatar Feb 14 '24 08:02 podger

Something wrong on Android emulator with api level 28 while using codeScanner. Plugin version is 3.9.0-beta.4

https://github.com/mrousavy/react-native-vision-camera/assets/5339870/12dfb876-a805-40d5-8ad1-ef0d70368f1b

Code of the app:

function App() {
  const { hasPermission, requestPermission } = useCameraPermission();
  useEffect(() => {
    if (!hasPermission) {
      requestPermission();
    }
  }, [hasPermission, requestPermission]);

  const device = useCameraDevice('back');

  const codeScanner = useCodeScanner({
    codeTypes: ['qr', 'ean-13'],
    onCodeScanned: codes => {
      console.log(codes);
    },
  });

  if (device == null) {
    return <Text>No device</Text>;
  }

  return (
    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
      <Camera
        style={StyleSheet.absoluteFill}
        device={device}
        isActive={true}
        orientation="portrait"
        audio={false}
        photo={false}
        video={false}
        codeScanner={codeScanner}
        onError={e => {
          console.log('Error', e);
        }}
      />
    </View>
  );
}

dFelinger avatar Feb 15 '24 10:02 dFelinger

Hey! I just released a new V4 beta (v4.0.0-beta.7) where I fixed a bunch of issues! 💪🚀 Can you test that and see if that fixes the issue for you? 😅

yarn add react-native-vision-camera@beta

You might need to increase the compileSdk to the newest Android SDK (34) if you are behind.

mrousavy avatar Mar 19 '24 10:03 mrousavy

If latest V4 fixes this bug, please consider 💖 sponsoring me on GitHub 💖 so I can keep maintaining this library, fixing bugs and building new features! :)

mrousavy avatar Mar 25 '24 09:03 mrousavy