Функция автофокуса для модуля камеры моего приложения для Android

Я работаю с модулем CAMERA для своего приложения несколько дней. Я настроил полный модуль камеры вместо того, чтобы вызывать аппаратную встроенную мобильную камеру через намерение. Я использовал обратные вызовы для затвора, изображения и т. Д. Теперь я пытаюсь добавить функции ZOOM и AUTO-FOCUS к этой настроенной камере. Кто-нибудь, пожалуйста, дайте мне знать, как добавить функции ZOOM и AUTO-FOCUS вместе с необходимыми разрешениями, которые должны быть упомянуты в файле манифеста. Надеюсь, мне помогут как можно скорее.


person raju asn    schedule 22.09.2011    source источник


Ответы (2)


Пара наблюдений с моей стороны.

1) Camera.autoFocus — это одноразовый вызов, применимый, когда Camera.getParameters.getFocusMode() является либо FOCUS-MODE-AUTO, либо FOCUS-MODE-MACRO, в других случаях вам не нужно вызывать метод autoFocus. См. документацию по API и преданно следуйте ей.

2) Однократный вызов означает, что этот метод не регистрирует экземпляр AutoFocusCallback для непрерывного получения уведомлений.

3) Скорее, FOCUS-MODE-AUTO даже не динамическая и непрерывная константа фокуса. Вместо этого вы можете использовать FOCUS-MODE-EDOF или FOCUS-MODE-CONTINUOUS-PICTURES в зависимости от уровня API и версии SDK, которую вы используете и для которой создаете.

4) Существует большая вероятность того, что фактическая камера устройства может не поддерживать некоторые константы FOCUS-MODE, такие как EDOF или INFINITE. Всегда убедитесь, что при создании параметров камеры вы проверяете getSupportedFocusModes и используете применимые константы.

5) Вызов camera.autoFocus непосредственно перед camera.takePicture может увеличить результирующий массив байтов jpeg в PictureCallBack как минимум на 50% больше, чем его исходный размер. Отсутствие явного вызова autoFocus() может иногда приводить к тому, что предыдущее autoFocus() заканчивается с очень низким разрешением, что может привести к тому, что длина jpeg-байтового массива составит всего 10 КБ, что приведет к нулевому растровому изображению из BitmapFactory.

6) О разрешениях автофокуса см. документацию по API.

7) Что касается масштабирования, то это не так сложно, как реализовать функцию автофокуса. В зависимости от взаимодействия с экраном, такого как слайдер, или аппаратных клавиш, таких как клавиши регулировки громкости, вы можете реализовать ZoomChangeListener, который вы можете зарегистрировать с помощью Camera, как только экземпляр Camera будет получен от open(int cameraId).

person AndroidRocks    schedule 26.03.2012
comment
Большое спасибо за ваше время и усилия - person swiftBoy; 26.09.2013

Для увеличения (2x):

   Camera.Parameters parameters = camera.getParameters();
   parameters.set("zoom", "2.0");
   parameters.set("taking-picture-zoom", "20");

Для уровня API> 5 используйте API, например setZoom( ) и т. д.

Для автофокусировки (взято с zxing)

public final boolean onKeyDown(int keyCode, KeyEvent event) {

synchronized(this) {
if (!bIsPictureTaking) {

    if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_CAMERA)    {

            if (!bIsPictureTaking && !bIsAutoFocusStarted){

                YourAutoFocusCallback autoFocusCallBack = new YourAutoFocusCallback();

                camera.autoFocus(autoFocusCallBack);

.

final class YourAutoFocusCallback implements Camera.AutoFocusCallback {


  private static final long AUTOFOCUS_INTERVAL_MS = 1500L;

  private final CameraConfigurationManager configManager;
  private boolean reinitCamera;
  private Handler autoFocusHandler;
  private int autoFocusMessage;

  AutoFocusCallback(CameraConfigurationManager configManager) {
    this.configManager = configManager;
  }

  void setHandler(Handler autoFocusHandler, int autoFocusMessage) {
    this.autoFocusHandler = autoFocusHandler;
    this.autoFocusMessage = autoFocusMessage;
  }

  public void onAutoFocus(boolean success, Camera camera) {
    if (autoFocusHandler != null) {
      Message message = autoFocusHandler.obtainMessage(autoFocusMessage, success);
      autoFocusHandler.sendMessageDelayed(message, AUTOFOCUS_INTERVAL_MS);
      autoFocusHandler = null;

        configManager.setDesiredCameraParameters(camera);
    } else {
     }
  }

}
person Reno    schedule 22.09.2011
comment
Правильно ли я предполагаю, что мне не нужен CameraConfigurationManager, если я setParameters SurfaceChanged и как создать/передать обработчик с помощью setHandler. Мой код фокуса здесь. Мне нужно нажать и удерживать кнопку спуска затвора в течение нескольких секунд, чтобы камера сфокусировалась, и только тогда я могу сделать снимок. Размещение кода PictureCallback в Thread/AsyncTask не помогло. Я позаимствовал код для кнопки ShutterButton здесь. - person vamsiampolu; 03.01.2014