camera2 api картинки темные андроид - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь сделать снимок из сервиса, используя camera2 api. Я получаю слишком темные снимки. Я пытался установить CONTROL_AE_EXPOSURE_COMPENSATION и использовал разные шаблоны камеры, но это не помогло. Может кто-нибудь помочь мне, почему я получаю темные фотографии? вот мой код:

private final ImageReader.OnImageAvailableListener onImageAvailableListener = (ImageReader imReader)->  {
    //get image and processes

};
private void takePicture() throws CameraAccessException {
    if (null == cameraDevice) {
        return;
    }
    final CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraDevice.getId());
    Size[] jpegSizes = null;
    StreamConfigurationMap streamConfigurationMap = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);//setting streamConfigurationMap
    if (streamConfigurationMap != null) {
        jpegSizes = streamConfigurationMap.getOutputSizes(ImageFormat.JPEG);
    }
    final boolean jpegSizesNotEmpty = jpegSizes != null && 0 < jpegSizes.length;
    int width = jpegSizesNotEmpty ? jpegSizes[0].getWidth() : 640;
    int height = jpegSizesNotEmpty ? jpegSizes[0].getHeight() : 480;
    final ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);
    final List<Surface> outputSurfaces = new ArrayList<>();
    outputSurfaces.add(reader.getSurface());
    final CaptureRequest.Builder captureBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);//setting template
    captureBuilder.addTarget(reader.getSurface());
    captureBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);//setting CONTROL_MODE
    captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, getOrientation());//setting mobile orientation
    captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);//setting ae mode
    captureBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CaptureRequest.CONTROL_AWB_MODE_AUTO);//setting white balance
    captureBuilder.set(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_HIGH_QUALITY);//setting color correction
    captureBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);//setting auto focus
    captureBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);//setting auto focus


    reader.setOnImageAvailableListener(onImageAvailableListener, null);
    cameraDevice.createCaptureSession(outputSurfaces, new CameraCaptureSession.StateCallback() {
                @Override
                public void onConfigured(@NonNull CameraCaptureSession session) {
                    cameraCaptureSession = session;
                    try {//taking picture
                        HandlerThread handlerThread = new HandlerThread("MyHandlerThread");
                        handlerThread.start();
                        Looper looper = handlerThread.getLooper();
                        Handler handler = new Handler(looper);
                        cameraCaptureSession.capture(captureBuilder.build(), captureListener,handler);
                    } catch (final CameraAccessException e) {
                        Log.e("error capture" , e.getMessage());
                    }

                }

                @Override
                public void onConfigureFailed(@NonNull CameraCaptureSession session) {//

                }
            }
            , null);
}

Редактировать : Мое приложение не имеет пользовательского интерфейса, общая программа работает только в фоновом режиме. Я тестировал с другими (samsung) мобильными телефонами, которые работают, но с той же версией Android (6.0.1) изображения слишком темные в мобильном Xiaomi. Я попытался добавить задержку, попытался с TEMPLATE_PREVIEW и оставил 50 первых изображений, у меня ничего не получалось. Любая помощь?

...