Автофокусировка Android при непрерывном режиме автоматической фокусировки не поддерживается

У меня есть камера внутри приложения, и я хочу, чтобы она автоматически фокусировалась так же, как это делает камера телефона. Я нашел режимы FOCUS_MODE_CONTINUOUS_VIDEO и FOCUS_MODE_CONTINUOUS_PICTURE, но они не поддерживаются некоторыми телефонами Gingerbread от HTC, на которых я тестирую.

Это то, что я делаю, чтобы определить, могу ли я использовать эти режимы:

        Camera.Parameters parameters = mCamera.getParameters();
        List<String> supportedFocusModes = parameters.getSupportedFocusModes();

        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH &&
            supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        }
        else if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
        }
        else if (supportedFocusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
            // auto focus on request only
            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
        }

Запустив несколько разных телефонов Gingerbread HTC, я не получаю непрерывные режимы, но я получаю "авто". Это позволяет мне автоматически фокусироваться по требованию (когда я вызываю mCamera.autoFocus(null), но камера не будет перефокусироваться, если пользователь перемещает камеру.

Я не могу установить режим фокусировки на что-либо, что камера не поддерживает, если я это сделаю, это будет пустым.

Одно из решений, которое я пробовал, - вызвать mCamera.autoFocus(null) на таймере. Но это заставляет камеру постоянно фокусироваться, даже если она уже находится в фокусе.

Есть ли способ реализовать непрерывный опыт автоматической фокусировки на этих телефонах? Когда я смотрю на приложение для камеры HTC на этих телефонах, у него есть непрерывная автофокусировка - когда вы перемещаетесь по фокусам камеры и не перефокусируете изображение, когда изображение находится в фокусе.

Ответ 1

У нас было требование поддерживать очень широкий спектр телефонов. Поэтому в конечном итоге мое решение заключалось в том, чтобы обрабатывать каждый случай по-разному.

Для сценария телефонов без постоянной поддержки автофокуса я реализовал утилиту для прослушивания акселерометра с помощью SensorManager и запускает mCamera.autoFocus(...) всякий раз, когда пользователь перемещает камеру.

Были также несколько старых планшетов, которые поддерживали фиксированный фокус (кто бы использовал такую вещь!), И в этом случае изображение нужно было сделать немедленно - не на обратном вызове фокуса.

И для большинства современных телефонов фрагмент кода выше был хорош для использования FOCUS_MODE_CONTINUOUS_PICTURE.

Ответ 2

У меня есть аналогичный pb на моем Samsung S4, и я решил его с:

camera.setParameters(parameters);
    camera.autoFocus(null);

Это предлагается в документе Google здесь.

Чтобы параметры камеры вступили в силу, ваше приложение должно вызвать setParameters(Camera.Parameters).