Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🐛 Fatal Error on App Initialization: IllegalArgumentException - width must be positive in CameraDeviceDetails.getFormats #3180

Closed
3 of 5 tasks
danielbcarvalho opened this issue Sep 9, 2024 · 6 comments · Fixed by #3236
Labels
🐛 bug Something isn't working

Comments

@danielbcarvalho
Copy link

What's happening?

I’m experiencing a fatal error on app initialization after updating to react-native-vision-camera version 4.2.0. The error occurs before the camera is opened, and I’m seeing a high number of these crashes reported in Firebase Crashlytics, especially on Xiaomi devices (74%) running Android 10 (81%). I see it mostly on Redmi Note 8 .

After updating to react-native-vision-camera version 4.2.0, I’ve observed a significant number of crashes related to this error in Firebase Crashlytics, the error occurs before the camera is opened and is predominantly on Xiaomi devices.

I’m reaching out to see if anyone has experienced this issue before and can offer guidance on how to resolve it. Any tips or solutions would be greatly appreciated since the issue isn’t reproducible on all devices I have access to.

  1. The app crashes on startup before the camera screen is displayed.
  2. I have not been able to reproduce the issue on my local device as I don’t have access to the specific models where this error is prevalent.

Reproduceable Code

import React, { useState, useEffect } from 'react';
import { Camera, useCameraDevice, useCodeScanner } from 'react-native-vision-camera';
import { View } from 'react-native';

const QrCodePaymentScreen = () => {
  const [activeCamera, setCameraActive] = useState(true);
  const device = useCameraDevice('back');

  const codeScanner = useCodeScanner({
    codeTypes: ['qr'],
    onCodeScanned: (codes) => {
      // Handle scanned QR codes
    },
  });

  useEffect(() => {
    // Example logic that might trigger the camera to start
    setCameraActive(true);
  }, []);

  if (!device) {
    return <ActivityIndicator size="large" />;
  }

  return (
    <View style={{ flex: 1 }}>
      <Camera
        audio={false}
        device={device}
        style={{ flex: 1 }}
        isActive={activeCamera}
        codeScanner={codeScanner}
      />
    </View>
  );
};

Relevant log output

`CameraDeviceDetails.getFormats
java.lang.IllegalArgumentException - width must be positive

Fatal Exception: java.lang.IllegalArgumentException
width must be positive
com.android.internal.util.Preconditions.checkArgumentPositive (Preconditions.java:275)
android.hardware.camera2.params.StreamConfigurationDuration. (StreamConfigurationDuration.java:58)
android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfigurationDuration$MarshalerStreamConfigurationDuration.unmarshal (MarshalQueryableStreamConfigurationDuration.java:68)
android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfigurationDuration$MarshalerStreamConfigurationDuration.unmarshal (MarshalQueryableStreamConfigurationDuration.java:45)
android.hardware.camera2.marshal.impl.MarshalQueryableArray$MarshalerArray.unmarshal (MarshalQueryableArray.java:93)
android.hardware.camera2.impl.CameraMetadataNative.getBase (CameraMetadataNative.java:567)
android.hardware.camera2.impl.CameraMetadataNative.getBase (CameraMetadataNative.java:537)
android.hardware.camera2.impl.CameraMetadataNative.getStreamConfigurationMap (CameraMetadataNative.java:1258)
android.hardware.camera2.impl.CameraMetadataNative.access$400 (CameraMetadataNative.java:89)
android.hardware.camera2.impl.CameraMetadataNative$5.getValue (CameraMetadataNative.java:605)
android.hardware.camera2.impl.CameraMetadataNative.get (CameraMetadataNative.java:437)
android.hardware.camera2.impl.CameraMetadataNative.get (CameraMetadataNative.java:400)
android.hardware.camera2.CameraCharacteristics.get (CameraCharacteristics.java:235)
androidx.camera.camera2.internal.compat.CameraCharacteristicsBaseImpl.get (CameraCharacteristicsBaseImpl.java:40)
androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat.get (CameraCharacteristicsCompat.java:108)
androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat.getStreamConfigurationMapCompat (CameraCharacteristicsCompat.java:134)
androidx.camera.camera2.internal.Camera2CameraInfoImpl.getSupportedResolutions (Camera2CameraInfoImpl.java:434)
com.mrousavy.camera.core.CameraDeviceDetails.getFormats (CameraDeviceDetails.kt:118)
com.mrousavy.camera.core.CameraDeviceDetails.toMap (CameraDeviceDetails.kt:79)
com.mrousavy.camera.react.CameraDevicesManager.getDevicesJson (CameraDevicesManager.kt:87)
com.mrousavy.camera.react.CameraDevicesManager.sendAvailableDevicesChangedEvent (CameraDevicesManager.kt:94)
com.mrousavy.camera.react.CameraDevicesManager$initialize$1.invokeSuspend (CameraDevicesManager.kt:71)
kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:33)
kotlinx.coroutines.DispatchedTask.run (DispatchedTask.kt:108)
java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1167)
java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:641)
java.lang.Thread.run (Thread.java:919)
`

Camera Device

I have not been able to reproduce the issue on my local device as I don’t have access to the specific models where this error is prevalent.

Device

Redmi Note 8

VisionCamera Version

4.2.0

Can you reproduce this issue in the VisionCamera Example app?

No, I cannot reproduce the issue in the Example app

Additional information

@danielbcarvalho danielbcarvalho added the 🐛 bug Something isn't working label Sep 9, 2024
Copy link

Guten Tag, Hans here! 🍻

Thanks for reporting zis issue. It looks like you are encountering a fatal exception related to camera device formats on specific devices, which definitely requires mrousavy's attention.

However, I noticed you did not provide logs from adb logcat. Could you please gather ze logs using adb logcat while reproducing ze crash? It would really help mrousavy to diagnose ze issue more effectively.

Also, sponsoring mrousavy can ensure your issues get prioritized attention.

Looking forward to your updates!

Note: If you think I made a mistake, please ping @mrousavy to take a look.

@tgreco
Copy link

tgreco commented Oct 3, 2024

@mrousavy getting this same error on the latest version of vision-camera (4.5.3)

java.lang.AssertionError: java.lang.reflect.InvocationTargetException at android.hardware.camera2.marshal.impl.MarshalQueryableRange$MarshalerRange.unmarshal(MarshalQueryableRange.java:95) at android.hardware.camera2.marshal.impl.MarshalQueryableRange$MarshalerRange.unmarshal(MarshalQueryableRange.java:37) at android.hardware.camera2.marshal.impl.MarshalQueryableArray$MarshalerArray.unmarshal(MarshalQueryableArray.java:157) at android.hardware.camera2.impl.CameraMetadataNative.getBase(CameraMetadataNative.java:611) at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:471) at android.hardware.camera2.impl.CameraMetadataNative.get(CameraMetadataNative.java:440) at android.hardware.camera2.CameraCharacteristics.get(CameraCharacteristics.java:295) at androidx.camera.camera2.internal.compat.CameraCharacteristicsBaseImpl.get(CameraCharacteristicsBaseImpl.java:38) at androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat.get(CameraCharacteristicsCompat.java:104) at androidx.camera.camera2.internal.Camera2CameraInfoImpl.getSupportedFrameRateRanges(Camera2CameraInfoImpl.java:541) at com.mrousavy.camera.core.CameraDeviceDetails.getFormats(CameraDeviceDetails.kt:119) at com.mrousavy.camera.core.CameraDeviceDetails.toMap(CameraDeviceDetails.kt:79) at com.mrousavy.camera.react.CameraDevicesManager.getDevicesJson(CameraDevicesManager.kt:87) at com.mrousavy.camera.react.CameraDevicesManager.sendAvailableDevicesChangedEvent(CameraDevicesManager.kt:94) at com.mrousavy.camera.react.CameraDevicesManager$initialize$1.invokeSuspend(CameraDevicesManager.kt:71) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:920) Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@594a539, java.util.concurrent.ThreadPoolExecutor@db7e77e[Running, pool size = 2, active threads = 1, queued tasks = 0, completed tasks = 2]] Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Constructor.newInstance0(Native Method) at java.lang.reflect.Constructor.newInstance(Constructor.java:343) at android.hardware.camera2.marshal.impl.MarshalQueryableRange$MarshalerRange.unmarshal(MarshalQueryableRange.java:87) ... 19 more Caused by: java.lang.IllegalArgumentException: lower must be less than or equal to upper at android.util.Range.<init>(Range.java:60) ... 22 more

This line
image

@mrousavy
Copy link
Owner

mrousavy commented Oct 4, 2024

bruh why does this throw an error

@GonzalezVictorJavier
Copy link

Hi, how are you?. We have this same issue (Same exception and Xiaomi participation percentage at devices with errors), but at our proprietary CameraX app implementation. Seems to be some kind of Xiaomi - CameraX error, right?

@eTryp
Copy link

eTryp commented Oct 9, 2024

Hi, thanks for this great library.
Just to highlight that I'm having the same issue on a Sunmi D3 device (https://www.sunmi.com). Even without any call to the camera, just by including it in the application.

@mrousavy
Copy link
Owner

Hey all! Fixed this in #3236.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐛 bug Something isn't working
Projects
None yet
5 participants