0

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

4

2 回答 2

6

我的一些观察结果。

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

2)一次性调用,表示该方法不注册 AutoFocusCallback实例连续接收通知。

3)相反,FOCUS-MODE-AUTO甚至不是动态和连续的焦点常数。相反,您可能希望使用FOCUS-MODE-EDOFFOCUS-MODE-CONTINUOUS-PICTURES依赖于您正在使用和构建的 API 级别和 SDK 版本。

4)实际的 Device Camera 很可能不支持某些 FOCUS-MODE常量,例如EDOFor INFINITE。始终确保在创建相机参数时检查 getSupportedFocusModes并使用适用的常量。

5)camera.autoFocus之前调用 camera.takePicture会使生成的 jpeg-byte-array 膨胀PictureCallBack到至少比原始大小多 50%。不显式调用autoFocus()有时可能会导致前autoFocus()一个以非常低的分辨率结束,这可能会导致 jpeg-byte-array 长度仅为 10K 字节,从而导致BitmapFactory.

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

7)关于变焦,没有实现自动对焦功能那么复杂。根据诸如滑块之类的屏幕交互或诸如音量键之类的硬件键,您可以实现一个ZoomChangeListener ,您可以在从 接收到实例Camera后立即向注册。Cameraopen(int cameraId)

于 2012-03-26T18:36:39.510 回答
3

For zoom (2x):

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

For api level > 5 use the api's like setZoom() etc

For autofocussing (taken from 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 {
     }
  }

}
于 2011-09-22T10:19:00.823 回答