Android Camera2 API setRepeatingRequest - PullRequest
       7

Android Camera2 API setRepeatingRequest

0 голосов
/ 10 марта 2020

Я делаю android приложение камеры с камерой2. мой код почти такой же, как в официальном образце camera2, но переведите фрагмент в действие. Я планирую установить масштаб в качестве параметра по умолчанию, поэтому сделал функцию масштабирования в openCamera (w, h). Ниже приведен мой код для установки масштабирования камеры по умолчанию.

private void openCamera(int width, int height) {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        requestCameraPermission();
        return;
    }
    setUpCameraOutputs(width, height);
    configureTransform(width, height);
    Activity activity = this;
    CameraManager manager = (CameraManager) activity.getSystemService(Context.CAMERA_SERVICE);
    try {
        if (!cameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
            throw new RuntimeException("Time out waiting to lock camera opening.");
        }
        manager.openCamera(cameraId, stateCallback, backgroundHandler);
    } catch (CameraAccessException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        throw new RuntimeException("Interrupted while trying to lock camera opening.", e);
    }

    try{
        CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId);
        float maxzoom = (characteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM));
        android.graphics.Rect m = characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
        float zoomLevel = maxzoom/3;
        float ratio = (float) 1/zoomLevel;
        int cropWidth = m.width() - Math.round((float)m.width()*ratio);
        int cropHeight = m.height() - Math.round((float)m.height()*ratio);
        android.graphics.Rect zoom = new android.graphics.Rect(cropWidth/2, cropHeight/2, m.width() - cropWidth/2, m.height() - cropHeight/2);
        previewRequestBuilder.set(CaptureRequest.SCALER_CROP_REGION, zoom);
        try{
            captureSession.setRepeatingRequest(previewRequestBuilder.build(), captureCallback, null); // Null Exception occur
        } catch (CameraAccessException e) {
            e.printStackTrace();
        } catch (NullPointerException ex) {
            ex.printStackTrace();
        }
    } catch (CameraAccessException e) {
        throw new RuntimeException("can not access camera.", e);
    }

}

Нет проблем с масштабированием и камерой. Но когда я устанавливаю свое приложение в android studio и запускаю приложение в первый раз, оно всегда прерывается с исключением нулевой точки в setreapeatingrequest (). После еще 2 или 3 попыток приложение работает нормально. Я подозреваю, что это исключение может произойти, потому что нет предварительного просмотра или что-то. Но я понятия не имею, как я могу исправить эту ошибку. Любое мнение должно быть очень полезным. Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...