Обратный вызов автофокуса камеры не происходит

Я использую Camera API на Android и заставил свой код работать на нескольких платформах, включая Samsung Galaxy и HTC Desire. Пока я испытываю проблему только на HTC Desire Z, которая носит периодический характер.

в моем коде я вызываю следующие инструкции

camera.startPreview();
camera.autoFocus(autoFocusCallback);

где я уже создал необходимый класс autoFocusCallback. Хочу еще раз подчеркнуть, что этот код работает на телефонах, в том числе и на том, с которым у меня проблемы, так что не лезьте в код. :) После вызова обратного вызова мой код делает снимок, но эта часть пока не имеет значения.

Периодическая проблема в том, что для определенной случайной картинки (происходит один раз из 20-100) callback не происходит. Я проверил с помощью своих собственных Log.i(), что это последняя выполненная команда (т.е. код не попадает в обратный вызов). Отладка также показывает, что об ошибках не сообщается.

Просто чтобы успокоиться, мой обратный вызов выглядит примерно так

AutoFocusCallback autoFocusCallback = new AutoFocusCallback() {
  @Override
  public void onAutoFocus(boolean success, Camera camera) {
    Log.i("tag","this ran"); 
    ...
    ...
  }
};

Результаты Logcat для успешного запуска выглядят примерно так

07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): startPreview X
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): autoFocus E
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): autoFocus X
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): runAutoFocus E
07-12 10:17:50.564: DEBUG/QualcommCameraHardware(1223): af start (fd 49)
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): native_set_afmode: ctrlCmd.status == 0
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): af done: 1
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): runAutoFocus X
07-12 10:17:51.184: DEBUG/QualcommCameraHardware(1223): takePicture(479)

Но проблемный запуск такой

07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): startPreview X
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): autoFocus E
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): autoFocus X
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): runAutoFocus E
07-12 10:17:52.194: DEBUG/QualcommCameraHardware(1223): af start (fd 49)

а потом зависает.

Я хотел бы знать, есть ли у кого-нибудь какие-либо идеи по поводу этой проблемы, или если вы испытали что-то подобное? Мне удалось найти в сети только одну тему с похожими проблемами, вот она http://groups.google.com/group/android-developers/browse_thread/thread/75ecb8db0ae02bdb


person Ian Low    schedule 12.07.2011    source источник


Ответы (2)


Вызовы автофокуса не имеют тайм-аута. Я сталкивался с некоторыми устройствами, в которых вызовы автофокуса время от времени не возвращались (даже в идеальных условиях). Где тот же код отлично работает на других устройствах.

Мое решение состояло в том, чтобы запустить собственный механизм тайм-аута для автофокуса. Я сделал это с запланированным будущим, но наилучшая реализация тайм-аута может зависеть от вашего конкретного варианта использования.

final ScheduledFuture<?> focusTimeoutFuture = mScheduledExecutorService.schedule(new Runnable() {
        @Override
        public void run()
        {
            takePictureAndCancelAutoFocus();
        }
    }, 3, TimeUnit.SECONDS);// add a 3 second timeout to autofocus

mCamera.autoFocus(new Camera.AutoFocusCallback() {
        @Override
        public void onAutoFocus(boolean b, Camera camera) 
        {                
            // cancel the timeout future if it didn't run already
            boolean canceledFuture = focusTimeoutFuture.cancel(false);
            if(canceledFuture)
            {
                takePictureAndCancelAutoFocus();
            }
        }
}
person Oren    schedule 15.04.2015
comment
Я не использовал именно ваше решение, но оно действительно помогло. Например. LG Spirit перестает фокусироваться после успешной фокусировки. - person Vojtěch; 04.07.2016

Не решение вашей конкретной проблемы, но вопрос в целом заключается в том, что вы можете вызвать автофокус перед запуском предварительного просмотра. В этом случае также не происходит автофокуса при включенном предварительном просмотре.

Из документации

«Этот метод действителен только при активном предварительном просмотре (между startPreview() и до stopPreview())».

person tmanthey    schedule 08.12.2012
comment
Отличный ответ!. Спасибо!! - person superUser; 10.06.2015