Apparence-io / CamerAwesome

📸 Embedding a camera experience within your own app shouldn't be that hard. A flutter plugin to integrate awesome Android / iOS camera experience.
https://ApparenceKit.dev
MIT License
911 stars 200 forks source link

Expception when there is no front-facing camera #356

Open bramp opened 1 year ago

bramp commented 1 year ago

Steps to Reproduce

Using camerawesome 2.0.0-dev.1 using the example:

CameraAwesomeBuilder.awesome(
  saveConfig: SaveConfig.photoAndVideo(),
  onMediaTap: (mediaCapture) {},
),

it display the camera preview, and all the UI. When I click the switch camera button in the lower left, the widget hangs, and I get a error in the logs

Expected results

This device does not have a front camera. I would expect that button to not be displayed. Even if it's displayed it shouldn't break like it does.

Actual results

The camera hangs.

About your device

Brand Model OS
Android Emulator (Pixel 5) with no front facing camera Android 8.0

Your flutter version

Flutter 3.10.2 • channel stable • https://github.com/flutter/flutter.git Framework • revision 9cd3d0d9ff (12 days ago) • 2023-05-23 20:57:28 -0700 Engine • revision 90fa3ae28f Tools • Dart 3.0.2 • DevTools 2.23.1

The exception I see:

E/flutter (32575): [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: PlatformException(IllegalArgumentException, java.lang.IllegalArgumentException: Provided camera selector unable to resolve a camera for the given use case, Cause: null, Stacktrace: java.lang.IllegalArgumentException: Provided camera selector unable to resolve a camera for the given use case
E/flutter (32575):  at androidx.camera.lifecycle.ProcessCameraProvider.bindToLifecycle(ProcessCameraProvider.java:583)
E/flutter (32575):  at androidx.camera.lifecycle.ProcessCameraProvider.bindToLifecycle(ProcessCameraProvider.java:409)
E/flutter (32575):  at com.apparence.camerawesome.cameraX.CameraXState.updateLifecycle(CameraXState.kt:262)
E/flutter (32575):  at com.apparence.camerawesome.cameraX.CameraAwesomeX.setSensor(CameraAwesomeX.kt:614)
E/flutter (32575):  at com.apparence.camerawesome.cameraX.CameraInterface$Companion.setUp$lambda$40$lambda$39(Pigeon.kt:1182)
E/flutter (32575):  at com.apparence.camerawesome.cameraX.CameraInterface$Companion.$r8$lambda$ZHbTrwdkSiMlwRs-cnrwr-AuDtg(Unknown Source:0)
E/flutter (32575):  at com.apparence.camerawesome.cameraX.CameraInterface$Companion$$ExternalSyntheticLambda1.onMessage(Unknown Source:2)
E/flutter (32575):  at io.flutter.plugin.common.BasicMessageChannel$IncomingMessageHandler.onMessage(BasicMessageChannel.java:217)
E/flutter (32575):  at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:295)
E/flutter (32575):  at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:322)
E/flutter (32575):  at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(Unknown Source:12)
E/flutter (32575):  at android.os.Handler.handleCallback(Handler.java:789)
E/flutter (32575):  at android.os.Handler.dispatchMessage(Handler.java:98)
E/flutter (32575):  at android.os.Looper.loop(Looper.java:164)
E/flutter (32575):  at android.app.ActivityThread.main(ActivityThread.java:6541)
E/flutter (32575):  at java.lang.reflect.Method.invoke(Native Method)
E/flutter (32575):  at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
E/flutter (32575):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
E/flutter (32575): , null)
E/flutter (32575): #0      CameraInterface.setSensor
E/flutter (32575): <asynchronous suspension>
E/flutter (32575): #1      CameraContext.setSensorConfig
E/flutter (32575): <asynchronous suspension>
E/flutter (32575): #2      CameraState.switchCameraSensor
E/flutter (32575): <asynchronous suspension>
E/flutter (32575):
g-apparence commented 1 year ago

Currently CameraX is not really working well on the emulator. Could you make a try with a real phone ?

bramp commented 1 year ago

Thanks. I don't have a real phone without a front facing camera :-(

But I guess the implication is a real phone should work? However quickly looking though the code, we should be able to detect how many cameras exist, and only display the switch button if there are more than one? Equally it seems possible up detect if there are front or back, and only ask for it if it exists?