Camera2:未调用 onCaptureCompleted()

Camera2: onCaptureCompleted() is not called

最近开始学习camera2api,但是遇到了一些麻烦。 当模拟相机时,此代码可以是 运行。 但是,当我使用 Webcam0 或虚拟场景时,它会在执行 captureburst() 后卡住,并且没有错误消息。 它只显示“应用程序可能在其主线程上做了太多工作”。 我检查它会调用 onCaptureStarted(),但不会调用 onCaptureCompleted()。 AVD 管理器:API30 Pixel 3

    public void takePicture(){

    if(cameraDevice == null){
        return ;
    }
    try {

        picturesRequestBuilder = cameraDevice.createCaptureRequest(cameraDevice.TEMPLATE_STILL_CAPTURE);
        //
        mImageReader.setOnImageAvailableListener(new OnImageAvailableListener(),mainHandler);
        //imageSurface = mImageReader.getSurface();
        //
        picturesRequestBuilder.addTarget(imageSurface);
        picturesRequestBuilder.addTarget(surface);
        picturesRequestBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
        //
        CaptureRequest captureRequest = picturesRequestBuilder.build();

        ArrayList<CaptureRequest> captureRequests = new ArrayList<>();
       for(int i=0;i<5;i++){
            captureRequests.add(captureRequest);
        }
         mCameraCaptureSession.captureBurst(captureRequests, new CaptureCallback(),mainHandler);
    }
    catch (CameraAccessException e) {
        e.printStackTrace();
    }
    Log.d("test","finished");
}

///////////////

private void setupCamera(){
    cameraManager = (CameraManager) getSystemService(CAMERA_SERVICE);

    try{
        cameraIdList = cameraManager.getCameraIdList();
        cameraId = cameraManager.getCameraIdList()[0]; // 取得後置鏡頭
        cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
    } catch (CameraAccessException e){
        e.printStackTrace();
    }

    StreamConfigurationMap streamConfigurationMap = cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
    Size[] outputSizes = streamConfigurationMap.getOutputSizes(ImageFormat.JPEG);

    /////camera支援最大的高與寬////
    cameraWidth = outputSizes[0].getWidth();
    cameraHeight = outputSizes[0].getHeight();
    //////////////////////////////
    REQUIRED_PERMISSIONS.add(android.Manifest.permission.CAMERA);
    REQUIRED_PERMISSIONS.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
}

/////////

public void setPreview(){
    List<Surface> outputSurface = new ArrayList<>(2);
    SurfaceTexture surfaceTexture = cameraPreview.getSurfaceTexture();
    ImageReader imageReader = ImageReader.newInstance( 1920 , 1080, ImageFormat.JPEG, 1);
    imageReader.setOnImageAvailableListener(new OnImageAvailableListener(), childHandler);
    mImageReader = imageReader;
    imageSurface = imageReader.getSurface();
    surface = new Surface(surfaceTexture);

    outputSurface.add(surface);
    outputSurface.add(imageSurface);
    try{
        previewRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        previewRequestBuilder.addTarget(surface);

        cameraDevice.createCaptureSession(outputSurface, new CameraCaptureSession.StateCallback() {
            @Override
            public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                if(cameraDevice == null){
                    return;
                }
                mCameraCaptureSession = cameraCaptureSession;
                try {
                    previewRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_AUTO);

                    mCameraCaptureSession.setRepeatingRequest(previewRequestBuilder.build(), null, childHandler);
                }catch (CameraAccessException e) {
                    Log.d("TAG", "Error creating the preview session");
                    Log.d("TAG", e.getMessage());
                }
            }

            @Override
            public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
                Log.d("fail","Failed");
            }
        }, childHandler);
    } catch (CameraAccessException e) {
         Log.d("TAG", "Error setting up the camera preview");
         Log.d("TAG", e.getMessage());
    }
}

如果您在 Android 11 beta(API 级别 30)中使用模拟器虚拟场景,则 JPEG 捕获中存在一个已知错误,您可能 运行 : https://buganizer.corp.google.com/issues/160382725

如果是有问题的错误,整个系统 logcat 应该会显示涉及相机 HAL 进程的 JPEG 库的崩溃。

这将在稍后对 Android 11 SDK 的更新中得到解决。