Обратного вызова автофокуса камеры не происходит - PullRequest
11 голосов
/ 12 июля 2011

Я использую 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 ]

6 голосов
/ 15 апреля 2015

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

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

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();
            }
        }
}
3 голосов
/ 08 декабря 2012

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

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

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

...