Intereting Posts
Как проверить, завершены ли все AsyncTasks? Java.lang.NoClassDefFoundError: javax.activation.DataHandler в android Что такое соглашение для имен пакетов java без ассоциации домена? Android Google Maps v2 – отладочная клавиша vs Release key Ошибка: выполнение выполнено для задачи «: app: processDebugGoogleServices». > Исправьте конфликт версий Масштабирование и перетаскивание изображений с использованием матрицы в android Как использовать OAuth 2.0 для отправки Gmail из Indy? Android: Каковы рекомендуемые конфигурации Proguard? Обнаружение Android-приложения работает в режиме отладки Android RecyclerView с GridLayoutManager делает диапазон элементов несколькими рядами Конвертировать приложение для Android в Google Play для Samsung Store Как я могу сосредоточиться на элементе EditText в виде разворачиваемого действия в панели действий (когда он расширен) и заставить открывать мягкую клавиатуру? Лучший способ периодически выполнять AsyncTasks в Android В чем разница между -keep и -keepclassmembers в ProGuard? Пример MultiSelectListPreference

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

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

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

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

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

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

Solutions Collecting From Web of "Обратный вызов автофокусировки камеры не происходит"

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

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

 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() )».