Функция «Автофокус» для модуля «Камера» моего приложения для Android - PullRequest
0 голосов
/ 22 сентября 2011

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

Ответы [ 2 ]

6 голосов
/ 26 марта 2012

Пара наблюдений с моего конца.

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-byte-array в PictureCallBack как минимум до 50% больше, чем его оригинальный размер. Не звонить autoFocus() явно может иногда приводит к тому, что предыдущий autoFocus() заканчивается очень с низким разрешением, которое может привести к длине массива jpeg-байтов всего 10 Кбайт, что приводит к растровому изображению с нулевым изображением из BitmapFactory.

6) Относительно разрешений автоматической фокусировки см. Документацию API.

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

3 голосов
/ 22 сентября 2011

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

   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 {
     }
  }

}
...