CameraDevice 无法创建会话 [Camera2]

Posted

技术标签:

【中文标题】CameraDevice 无法创建会话 [Camera2]【英文标题】:CameraDevice failing to create session [Camera2] 【发布时间】:2016-03-03 10:02:37 【问题描述】:

我正在尝试使用Camera2 API 将相机数据流式传输到SurfaceView。我正在关注本指南:Camera2 guide

我无法通过step 5

MainActivity.java::onCreate()

setContentView(R.layout.activity_main);

surfaceView = (SurfaceView)findViewById(R.id.surface);
manager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);

MainActivity.java::onClick()

for (String id : manager.getCameraIdList()) 
    CameraCharacteristics characteristics = manager.getCameraCharacteristics(id);

    Integer direction = characteristics.get(CameraCharacteristics.LENS_FACING);

    if (direction != null && direction == CameraCharacteristics.LENS_FACING_BACK) 
        if (checkCallingOrSelfPermission("android.permission.CAMERA") == PackageManager.PERMISSION_GRANTED)
            manager.openCamera(id, new StateCallback(), null);

        break;
    

MainActivity.java.StateCallback::onOpened(CameraDevice camera)

List<Surface> surfaces = new LinkedList<>();
surfaces.add(surfaceView.getHolder().getSurface());

CaptureRequest.Builder builder = camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(surfaces.get(0));

camera.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback() 
    @Override
    public void onConfigured(CameraCaptureSession session) 
        Log.i(TAG, "Configured");
    

    @Override
    public void onConfigureFailed(CameraCaptureSession session) 
        Log.e(TAG, "Configured failed"); // Ends up in this function :(
    
    , null);

程序以onConfigureFailed() 函数结束。我不知道可能是什么错误,也不知道如何检查是什么。

我的猜测是我在CaptureRequest 中遗漏了一些东西,但我不知道是什么。

我正在使用Samsung Galaxy S4。

【问题讨论】:

请在您看到失败时添加 logcat 输出。摄像头服务应该在 logcat 中有更多关于为什么无法创建会话的信息。 你好@Arbitur 我对 s4 也有同样的问题,你找到任何线索了吗? 【参考方案1】:

像这样覆盖onConfigureFailed()

   @Override
   public void onConfigureFailed(CameraCaptureSession session) 
       ImageReader mReader = ImageReader.newInstance(640, 480, ImageFormat.JPEG, 1);
       takePicture() // function to get image
       createCameraPreview(); // function to set camera Preview on screen
   

调用createCameraPreview函数重启相机,否则会卡住。 您可以使用新值更改 ImageReader

ImageReader mReader = ImageReader.newInstance(640, 480, ImageFormat.JPEG, 1);

并再次调用takePicture()函数,这样用户就不必再次点击来捕获图像了。

【讨论】:

【参考方案2】:

添加到 onConfigured:

  if (null == cameraDevice) 
        Log.e(TAG, "updatePreview error, return");
        return;
    
    captureRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
    try 
        cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler);
     catch (CameraAccessException e) 
        e.printStackTrace();
    

【讨论】:

以上是关于CameraDevice 无法创建会话 [Camera2]的主要内容,如果未能解决你的问题,请参考以下文章

调用需要 API 级别 21(当前最低为 17):android.hardware.camera2.CameraDevice.StateCallback

当应用程序处于 onStop 状态时尝试录制视频时,CameraDevice.StateCallback 获取 onError(值 3)

如何让 CameraDevice 在 camera2 中工作?

选择 CameraDevice.rear 时,Flutter ImagePicker 以自拍模式打开

无法创建新的远程会话 - Selenium webdriver

无法创建新的远程会话。 Appium