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

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

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

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

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

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