Как автоматически сфокусироваться с Android CameraX - PullRequest
0 голосов
/ 30 сентября 2019

Android выпустила новый API Camerax в последние месяцы. Я пытаюсь понять, как настроить автофокусировку для работы камеры.

https://groups.google.com/a/android.com/forum/#!searchin/camerax-developers/auto$20focus|sort:date/camerax-developers/IQ3KZd8iOIY/LIbrRIqEBgAJ

Здесь обсуждается эта тема, но по ней почти нет специальной документации.

https://github.com/android/camera-samples/tree/master/CameraXBasic/app/src/main/java/com/android/example/cameraxbasic

Это также базовое приложение camerax, но я не смог найти файл, связанный с автоматической фокусировкой.

Любые советы или указания по документации полезны,Также я довольно новичок в Android, поэтому вполне возможно, что мне не хватает чего-то, что делает вышеуказанные ссылки более полезными.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Существует проблема с некоторыми устройствами Android, когда камера не выполняет автофокусировку с CameraX. Команда CameraX знает об этом и отслеживает его с помощью внутреннего билета и, надеюсь, скоро исправит проблему.

0 голосов
/ 03 октября 2019

Здесь вы можете найти документ о Фокусе, как он был добавлен в "1.0.0-alpha05" https://developer.android.com/jetpack/androidx/releases/camera#camera2-core-1.0.0-alpha05

По сути, вы должны установить сенсорный приемник на вашем виде и захватить нажатую позицию

private boolean onTouchToFocus(View viewA, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                break;
            case MotionEvent.ACTION_UP:
                    return focus(event);
                break;
            default:
                // Unhandled event.
                return false;
        }
        return true;
    }

И перевести эту позицию в точку

private boolean focus(MotionEvent event) {
        final float x = (event != null) ? event.getX() : getView().getX() + getView().getWidth() / 2f;
        final float y = (event != null) ? event.getY() : getView().getY() + getView().getHeight() / 2f;

        TextureViewMeteringPointFactory pointFactory = new TextureViewMeteringPointFactory(textureView);
        float afPointWidth = 1.0f / 6.0f;  // 1/6 total area
        float aePointWidth = afPointWidth * 1.5f;
        MeteringPoint afPoint = pointFactory.createPoint(x, y, afPointWidth, 1.0f);
        MeteringPoint aePoint = pointFactory.createPoint(x, y, aePointWidth, 1.0f);

           try {
            CameraX.getCameraControl(lensFacing).startFocusAndMetering(
                FocusMeteringAction.Builder.from(afPoint, FocusMeteringAction.MeteringMode.AF_ONLY)
                                           .addPoint(aePoint, FocusMeteringAction.MeteringMode.AE_ONLY)
                                           .build());
        } catch (CameraInfoUnavailableException e) {
            Log.d(TAG, "cannot access camera", e);
        }

        return true;
    }
...