Android CameraX - Получить информацию о камере (угол обзора, размер изображения предварительного просмотра) - PullRequest
2 голосов
/ 22 июня 2019

Я пытаюсь перейти от старого API камеры Android к новому API CameraX. Я использую режим предварительного просмотра для приложения дополненной реальности, и мне нужно получить некоторую информацию, например, угол зрения и размер на моей камере, используемой для предварительного просмотра.

Это мой код:

PreviewConfig config = new PreviewConfig.Builder()
                .setLensFacing(CameraX.LensFacing.BACK)
                .setTargetResolution(new Size(dsiWidth, dsiHeight))
                .build();
Preview preview = new Preview(config);
preview.setOnPreviewOutputUpdateListener(new Preview.OnPreviewOutputUpdateListener() {
            @Override
            public void onUpdated(Preview.PreviewOutput output) {
                tvCameraView.setSurfaceTexture(output.getSurfaceTexture());
            }
        });
CameraX.bindToLifecycle(this, preview);

Пока это работает. Но как мне получить информацию о камере, используемой в Preview? Большое спасибо заранее!

1 Ответ

0 голосов
/ 27 июня 2019

Когда вы используете зависимость "androidx.camera:camera-camera2:1.0.0-alpha02", вы можете взглянуть на класс Camera2CameraFactory. Там вы можете увидеть, как определяется передняя и задняя камеры.

    @Override
    public Set<String> getAvailableCameraIds() throws CameraInfoUnavailableException {
        List<String> camerasList = null;
        try {
            camerasList = Arrays.asList(mCameraManager.getCameraIdList());
        } catch (CameraAccessException e) {
            throw new CameraInfoUnavailableException(
                    "Unable to retrieve list of cameras on device.", e);
        }
        // Use a LinkedHashSet to preserve order
        return new LinkedHashSet<>(camerasList);
    }

    @Nullable
    @Override
    public String cameraIdForLensFacing(LensFacing lensFacing)
            throws CameraInfoUnavailableException {
        Set<String> cameraIds = getAvailableCameraIds();

        // Convert to from CameraX enum to Camera2 CameraMetadata
        Integer lensFacingInteger = -1;
        switch (lensFacing) {
            case BACK:
                lensFacingInteger = CameraMetadata.LENS_FACING_BACK;
                break;
            case FRONT:
                lensFacingInteger = CameraMetadata.LENS_FACING_FRONT;
                break;
        }

        for (String cameraId : cameraIds) {
            CameraCharacteristics characteristics = null;
            try {
                characteristics = mCameraManager.getCameraCharacteristics(cameraId);
            } catch (CameraAccessException e) {
                throw new CameraInfoUnavailableException(
                        "Unable to retrieve info for camera with id " + cameraId + ".", e);
            }
            Integer cameraLensFacing = characteristics.get(CameraCharacteristics.LENS_FACING);
            if (cameraLensFacing == null) {
                continue;
            }
            if (cameraLensFacing.equals(lensFacingInteger)) {
                return cameraId;
            }
        }

        return null;
    }

Это сводится к выбору первой камеры, которая соответствует ориентации из службы камеры. Я предполагаю, что они расширят эти apis в будущем выпуске camerax.

...