Android CameraX用例绑定失败

Android CameraX用例绑定失败,android,android-camerax,Android,Android Camerax,设备:华为P40 Lite E 依赖项: //CameraX dependencies def camerax_version = "1.1.0-alpha03" //ML kit for computer vision, needed for face detection //bundled with app implementation 'com.google.mlkit:face-detection:16.0.6' //CameraX core library us

设备:华为P40 Lite E 依赖项:

//CameraX dependencies
def camerax_version = "1.1.0-alpha03"

//ML kit for computer vision, needed for face detection
//bundled with app
implementation 'com.google.mlkit:face-detection:16.0.6'

//CameraX core library using camera 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-alpha23"
堆栈跟踪:

E/CameraManager: Use case binding failed
    java.lang.IllegalArgumentException: No supported surface combination is found for camera device - Id : 0.  May be attempting to bind too many use cases. Existing surfaces: [] New configs: [androidx.camera.core.impl.PreviewConfig@eec1a35, androidx.camera.core.impl.ImageAnalysisConfig@4817eca, androidx.camera.core.impl.ImageCaptureConfig@a00b83b]
        at androidx.camera.lifecycle.LifecycleCameraRepository.bindToLifecycleCamera(LifecycleCameraRepository.java:278)
        at androidx.camera.lifecycle.ProcessCameraProvider.bindToLifecycle(ProcessCameraProvider.java:428)
        at androidx.camera.lifecycle.ProcessCameraProvider.bindToLifecycle(ProcessCameraProvider.java:302)
        at nl.innovalor.ocr.vizcapture.camerax.VIZCameraXManager.bindCameraUseCases(VIZCameraXManager.java:593)
        at -.lambda$startCamera$2$CameraManager(CameraManager.java:337)
        at -.-$$Lambda$CameraManager$3Pt5AM_BPyOCEft3HHixQCAePBk.run(Unknown Source:4)
        at android.os.Handler.handleCallback(Handler.java:900)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at android.os.Looper.loop(Looper.java:219)
        at android.app.ActivityThread.main(ActivityThread.java:8349)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
代码:


具体来说,仅在华为手机上出现故障,而例如OnePlus 5T、Pixel 3、Galaxy手机,我没有这个问题。

并非所有摄像设备都支持YUV中的同步图像捕获和YUV中的图像分析;如果您将ImageCapture切换为JPEG,则在所有设备上都可以(如果您想要详细信息,可以查看底层camera2 API会话创建中的)。如果其中一个是JPEG,则受限级别的摄像头设备仅支持3个输出。不过,完整级别的设备应该支持它


这就是为什么setBufferFormat不是CameraX公共API的一部分-使用它可以轻松地将您从相机设备通常支持的输出集合中推出。

这实际上是有道理的。我已经在研究
CameraCharacteristics.INFO\u支持的硬件级别
,发现一些设备(主要是华为)限制了camera2 API访问,用
CameraCharacteristics.INFO\u支持的硬件级别
表示。我没有出现此错误的其他设备具有完全或级别3支持,因此可以解释这一点。谢谢,这真的帮我解决了。
// Unbind use cases before rebinding
cameraProvider.unbindAll();

//preview
Preview preview = new Preview.Builder()
  .setTargetResolution(new Size(previewWidth, previewHeight))
  .setTargetRotation(ROTATION_0) //ROTATION_90 // //rotation
  .build();

preview.setSurfaceProvider(previewView.getSurfaceProvider());

//viewport defines the buffer rect visible to end users
final ViewPort viewPort = new ViewPort.Builder(new Rational(previewWidth, previewHeight), ROTATION_0).build(); //rotation

//picture callback
imageCapture = new ImageCapture.Builder()
  .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
  .setBufferFormat(ImageFormat.YUV_420_888)
  .setTargetResolution(new Size(pictureWidth, pictureHeight))
  .setTargetRotation(ROTATION_0) //rotation
  .build();


//face detection analysis
imageAnalysis = new ImageAnalysis.Builder()
  //ensure that backpressure strategy is set to its default strategy for real-time analysis
    .setBackpressureStrategy(STRATEGY_KEEP_ONLY_LATEST)
    .setTargetResolution(new Size(previewWidth, previewHeight))
    .setTargetRotation(ROTATION_0) //rotation
  .build();


setFaceDetector(imageAnalysis, 0.05f); //0.1f

//use UseCaseGroup to assign viewport to use cases
UseCaseGroup useCaseGroup = new UseCaseGroup.Builder()
  .addUseCase(preview)
  .addUseCase(imageAnalysis)
  .addUseCase(imageCapture)
  .setViewPort(viewPort)
  .build();

this.camera = cameraProvider.bindToLifecycle((LifecycleOwner) activity, cameraSelector, useCaseGroup); //preview, imageAnalysis, imageCapture
^^^^^^ fails here on this line ^^^^^^^