我的Android应用程序的“相机”模块的“自动对焦”功能

时间:2011-09-22 10:12:41

标签: android camera android-camera autofocus camera-calibration

我几天以来一直在为我的应用程序使用CAMERA模块。 我已经定制了完整的相机模块,而不是通过意图调用硬件内置的移动相机。我用过快门,图片等的回叫  现在我正在尝试将ZOOM和AUTO-FOCUS功能添加到此自定义相机中。任何人都可以告诉我添加ZOOM和AUTO-FOCUS功能的方法以及清单文件中应该提到的所需权限。希望我能尽快得到帮助。

2 个答案:

答案 0 :(得分:6)

我最后的一些观察结果。

1) Camera.autoFocus是一次性通话,适用时     Camera.getParameters.getFocusMode()FOCUS-MODE-AUTO或。FOCUS-MODE-MACRO     autoFocus,在其他情况下,您不需要调用     AutoFocusCallback方法。请参阅API文档并专心关注它们。

2)通过一次性调用,意味着此方法不会注册     FOCUS-MODE-AUTO实例持续接收通知。

3)相反,FOCUS-MODE-EDOF甚至不是一个动态和持续的焦点     不变。相反,您可能希望使用FOCUS-MODE-CONTINUOUS-PICTURES或     FOCUS-MODE取决于API级别和     您正在使用和构建的SDK版本。

4)有每一个     实际的设备相机可能不支持某些可能性     EDOF常量,例如INFINITEgetSupportedFocusModes。始终确保     在创建摄像机参数时,请检查     camera.autoFocus并使用适用的常量。

5)致电     camera.takePicture之前的PictureCallBack可能会膨胀     导致autoFocus()中的jpeg-byte-array至少达到50%     超过它的原始尺寸。不明确地调用autoFocus()可能     有时导致之前的BitmapFactory结束     低分辨率可能导致jpeg-byte-array长度仅为a     10K字节,产生ZoomChangeListener的空图像位图。

6)关于自动对焦权限,请参阅API文档。

7)关于     缩放,它没有实现自动对焦那么复杂     特征。取决于屏幕交互,例如滑块或硬件     诸如音量键之类的键,您可以实现Camera     您可以在Camera实例后立即注册open(int cameraId)     是从{{1}}收到的。

答案 1 :(得分:3)

缩放(2x):

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

对于api级别> 5使用类似setZoom()等的api

用于自动聚焦(取自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 {
     }
  }

}