Dmitry
Dmitry

Reputation: 156

CameraX crashes when get cameraProviderFuture

With the official CameraX example on fourth step - Implement Preview use case:

     // Used to bind the lifecycle of cameras to the lifecycle owner
       val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

I've got a crash:

2020-07-01 12:37:41.054 1767-1803/com.example.camera2 W/CameraX: CameraX initialize() failed
    androidx.camera.core.InitializationException: java.lang.NumberFormatException: For input string: "/dev/video0"
        at androidx.camera.core.CameraX.lambda$initInternal$7$CameraX(CameraX.java:1056)
        at androidx.camera.core.-$$Lambda$CameraX$PC4SOFGjuqUVT4bexY644vLmWFE.run(Unknown Source:8)
        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:764)
     Caused by: java.lang.NumberFormatException: For input string: "/dev/video0"
        at java.lang.Integer.parseInt(Integer.java:604)
        at java.lang.Integer.parseInt(Integer.java:650)
        at androidx.camera.camera2.internal.SupportedSurfaceCombination.getRecordSize(SupportedSurfaceCombination.java:1127)
        at androidx.camera.camera2.internal.SupportedSurfaceCombination.generateSurfaceSizeDefinition(SupportedSurfaceCombination.java:1086)
        at androidx.camera.camera2.internal.SupportedSurfaceCombination.<init>(SupportedSurfaceCombination.java:109)
        at androidx.camera.camera2.internal.Camera2DeviceSurfaceManager.init(Camera2DeviceSurfaceManager.java:87)
        at androidx.camera.camera2.internal.Camera2DeviceSurfaceManager.<init>(Camera2DeviceSurfaceManager.java:75)
        at androidx.camera.camera2.internal.Camera2DeviceSurfaceManager.<init>(Camera2DeviceSurfaceManager.java:67)
        at androidx.camera.camera2.Camera2Config.lambda$defaultConfig$0(Camera2Config.java:59)
        at androidx.camera.camera2.-$$Lambda$Camera2Config$mYXXnxW6sa_oF7xhp51ozRSO_ck.newInstance(Unknown Source:0)
        at androidx.camera.core.CameraX.lambda$initInternal$7$CameraX(CameraX.java:1034)
        at androidx.camera.core.-$$Lambda$CameraX$PC4SOFGjuqUVT4bexY644vLmWFE.run(Unknown Source:8) 
        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:764) 
2020-07-01 12:38:11.142 1767-1767/com.example.camera2 D/AndroidRuntime: Shutting down VM
2020-07-01 12:38:11.346 1767-1767/com.example.camera2 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.camera2, PID: 1767
    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:503)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
     Caused by: java.util.concurrent.ExecutionException: androidx.camera.core.InitializationException: java.lang.NumberFormatException: For input string: "/dev/video0"
        at androidx.concurrent.futures.AbstractResolvableFuture.getDoneValue(AbstractResolvableFuture.java:518)
        at androidx.concurrent.futures.AbstractResolvableFuture.get(AbstractResolvableFuture.java:475)
        at androidx.concurrent.futures.CallbackToFutureAdapter$SafeFuture.get(CallbackToFutureAdapter.java:199)
        at androidx.camera.core.impl.utils.futures.FutureChain.get(FutureChain.java:155)
        at androidx.camera.core.impl.utils.futures.ChainingListenableFuture.get(ChainingListenableFuture.java:105)
        at com.example.camera2.MainActivity$startCamera$1.run(MainActivity.kt:75)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6718)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
     Caused by: androidx.camera.core.InitializationException: java.lang.NumberFormatException: For input string: "/dev/video0"
        at androidx.camera.core.CameraX.lambda$initInternal$7$CameraX(CameraX.java:1056)
        at androidx.camera.core.-$$Lambda$CameraX$PC4SOFGjuqUVT4bexY644vLmWFE.run(Unknown Source:8)
        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:764)
     Caused by: java.lang.NumberFormatException: For input string: "/dev/video0"
        at java.lang.Integer.parseInt(Integer.java:604)
        at java.lang.Integer.parseInt(Integer.java:650)
        at androidx.camera.camera2.internal.SupportedSurfaceCombination.getRecordSize(SupportedSurfaceCombination.java:1127)
        at androidx.camera.camera2.internal.SupportedSurfaceCombination.generateSurfaceSizeDefinition(SupportedSurfaceCombination.java:1086)
        at androidx.camera.camera2.internal.SupportedSurfaceCombination.<init>(SupportedSurfaceCombination.java:109)
        at androidx.camera.camera2.internal.Camera2DeviceSurfaceManager.init(Camera2DeviceSurfaceManager.java:87)
        at androidx.camera.camera2.internal.Camera2DeviceSurfaceManager.<init>(Camera2DeviceSurfaceManager.java:75)
        at androidx.camera.camera2.internal.Camera2DeviceSurfaceManager.<init>(Camera2DeviceSurfaceManager.java:67)
        at androidx.camera.camera2.Camera2Config.lambda$defaultConfig$0(Camera2Config.java:59)
        at androidx.camera.camera2.-$$Lambda$Camera2Config$mYXXnxW6sa_oF7xhp51ozRSO_ck.newInstance(Unknown Source:0)
        at androidx.camera.core.CameraX.lambda$initInternal$7$CameraX(CameraX.java:1034)
        at androidx.camera.core.-$$Lambda$CameraX$PC4SOFGjuqUVT4bexY644vLmWFE.run(Unknown Source:8) 
        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:764) 
2020-07-01 12:38:11.481 1767-1767/com.example.camera2 I/Process: Sending signal. PID: 1767 SIG: 9

I'm using non stock device with two cameras that works fine with Camera2Basic example. In the project sets the latest camerax libs.:

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    def camerax_version = '1.0.0-beta06'
    implementation "androidx.camera:camera-core:${camerax_version}"
    implementation "androidx.camera:camera-camera2:$camerax_version"
    implementation "androidx.camera:camera-lifecycle:$camerax_version"
    implementation 'androidx.camera:camera-view:1.0.0-alpha13'
    implementation 'androidx.camera:camera-extensions:1.0.0-alpha13'

I've tried setup manually CameraXConfig.Provider, but with the same issue on get cameraProviderFuture.

Anybody have an example of manually configuration ProcessCameraProvider with binding to specific camera device? Maybe any ideas how to setup preview with specific camera?

Upvotes: 2

Views: 1536

Answers (2)

Sam
Sam

Reputation: 144

You have to use the exact version of their camerax otherwise it might not work.

def camerax_version = "1.0.0-beta03"
// CameraX core library using camera2 implementation
implementation "androidx.camera:camera-camera2:$camerax_version"
// CameraX Lifecycle Library
implementation "androidx.camera:camera-lifecycle:$camerax_version"
// CameraX View class
implementation "androidx.camera:camera-view:1.0.0-alpha10"

Upvotes: 1

Dmitry
Dmitry

Reputation: 156

In my case the problem is that camera has EXTERNAL HAL. According to official CameraX team answer its not yet supported for now. To check camera HAL:

adb shell dumpsys media.camera

and check for android.info.supportedHardwareLevel in the output, it could be something like:

...
== Camera HAL device [email protected]/external//dev/video0 (v3.4) static information: ==
  Resource cost: 100
  Conflicting devices: None
  API1 info:
    Has a flash unit: false
    Facing: Front
    Orientation: 0
  API2 camera characteristics:
    Dumping camera metadata array: 52 / 52 entries, 2224 / 2224 bytes of extra data.
      Version: 1, Flags: 00000000
      android.info.supportedHardwareLevel (150000): byte[1]
        [EXTERNAL ]
...

To avoid such limitation I injected custom CameraDeviceSurfaceManager with the required camera resolution and sizes for my case . The solution is here.

Upvotes: 1

Related Questions