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

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

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

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

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

Непостоянная проблема заключается в том, что для определенного случайного изображения (происходит один из 20-100 раз) обратного вызова не происходит. Своими собственными 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

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();
            }
        }
}

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

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

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

Другие вопросы по тегам