Intereting Posts
Мастер установки Android Studio не установлен Почему Android Eclipse постоянно обновляет внешние папки и использует forver? Как получить информацию о пользователе из twitter в приложении Android? Как запустить несколько видеороликов с различными видеообъявлениями в одном из видов деятельности в Android 2.2? Как узнать, когда устройство BLE подписывается на характеристику на Android? Android Studio: создайте календарь с listView для каждого дня Как добавить банку в внешние библиотеки в студии android App объявляет зависимость от конфигурации 'compile' к конфигурации 'default', которая не объявлена ​​в дескрипторе для проекта Как мы можем получить уведомление, если у телефона есть доступ в Интернет? Как использовать Robolectric 2.4 в Android Studio 1.1.0 и gradle 2.2.1 Android.os.NetworkOnMainThreadException в службе в отдельном процессе Зависимость Dagger2 – Gradle Android AlertDialog Box не отображается Загрузка Base64 с Android / Java на RoR Carrierwave Это ошибка с CheckBox в Android?

Автофокусировка Android не работает после создания вида камеры

Я пытаюсь создать свой собственный Camera View, у меня есть все, кроме автофокусировки, я не могу понять, почему это не сработает. Вот мой код для CameraView.java

public class CameraView extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder surface_Holder; private Camera main_Camera; boolean on; public CameraView(Context context, Camera camera){ super(context); main_Camera = camera; main_Camera.setDisplayOrientation(90); surface_Holder = getHolder(); surface_Holder.addCallback(this); surface_Holder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL); } public boolean isOn(){ return on; } @Override public void surfaceCreated(SurfaceHolder holder) { try{ main_Camera.setPreviewDisplay(holder); main_Camera.startPreview(); }catch (Exception e){ Log.d("Error", "Canmera error on surfaceCreated" + e.getMessage()); main_Camera.release(); main_Camera = null; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if(holder.getSurface()==null){ return; } try{ main_Camera.stopPreview(); }catch (Exception e){ } try{ main_Camera.setPreviewDisplay(surface_Holder); main_Camera.startPreview(); }catch (IOException e){ Log.d("Error", "Camera error on surfaceChanged " + e.getMessage()); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { main_Camera.setPreviewCallback(null); main_Camera.stopPreview(); main_Camera.release(); main_Camera= null; } } 

Внутри моего манифеста у меня есть следующее:

 <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> 

 //set camera to continually auto-focus Camera.Parameters params = c.getParameters(); //*EDIT*//params.setFocusMode("continuous-picture"); //It is better to use defined constraints as opposed to String, thanks to AbdelHady params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); c.setParameters(params); 

Если вы добавили в свой манифест <uses-feature android:name="android.hardware.camera.autofocus" /> это не означает, что камера сделает autofocus . Это означает, что вы предоставляете своему приложению разрешение на использование оборудования или программного обеспечения камеры, которые занимаются автофокусом.

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

Чтобы настроить камеру на фокусировку, вы можете добавить этот метод в свой класс CameraView :

 private void setFocus(String mParameter) { Camera.Parameters mParameters = mCamera.getParameters(); mParameters.setFocusMode(mParameter); mCamera.setParameters(mParameters); } 

А затем вызовите этот метод в surfaceChanged() следующим образом:

 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { ...//your code here // Set focus mode to continuous picture setFocus(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); // Start camera preview mCamera.startPreview(); } 

Вы можете выбирать между этими focus parameters :

String FOCUS_MODE_AUTO Режим автоматической фокусировки.

String FOCUS_MODE_CONTINUOUS_PICTURE Непрерывный режим автоматической фокусировки, предназначенный для съемки.

String FOCUS_MODE_CONTINUOUS_VIDEO Режим непрерывной автофокусировки, предназначенный для видеозаписи.

String FOCUS_MODE_EDOF Расширенная глубина резкости (EDOF).

String FOCUS_MODE_FIXED Фокус исправлен.

String FOCUS_MODE_INFINITY Фокус установлен на бесконечность.

String FOCUS_MODE_MACRO Режим макросъемки (макросъемка).

Вот несколько вариантов:

  1. Пользователь arsalank2 рекомендует использовать «непрерывный автофокус», как описано в этом ответе . Однако, похоже, некоторые устройства HTC не поддерживают это. Проверьте с помощью: parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTIN‌​UOUS_VIDEO)

  2. Вы можете реализовать прослушиватель onSensorChanged и сосредоточиться с обратным вызовом, когда выполняются определенные критерии, см. Этот ответ Хуана Асеведо .

  3. Обрабатывайте каждый случай по-разному, чтобы поддерживать самый широкий диапазон устройств. Проверьте, что работает с разными моделями разных устройств, поскольку вы не можете полностью полагаться на то, что говорит уровень API.

Я бы рекомендовал перейти к опции 3, поскольку, похоже, нет никакого метода, который работает для каждого отдельного устройства.