在Android相机类中,自动对焦应该放在哪里?

4
我想使用自动聚焦,但我不知道在哪里放置自动聚焦。有人知道如何实现自动聚焦吗?

----------preview class----------

 package com.marakana;

 import java.io.IOException;

 import android.content.Context;
 import android.hardware.Camera;
 import android.hardware.Camera.PreviewCallback;
 import android.util.Log;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;

class Preview extends SurfaceView implements SurfaceHolder.Callback { // <1>
private static final String TAG = "Preview";

SurfaceHolder mHolder;  // <2>
public Camera camera; // <3>

Preview(Context context) {
super(context);

// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();  // <4>
mHolder.addCallback(this);  // <5>
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // <6>
}

 // Called once the holder is ready
public void surfaceCreated(SurfaceHolder holder) {  // <7>
// The Surface has been created, acquire the camera and tell it where
// to draw.
camera = Camera.open(); // <8>
try {
  camera.setPreviewDisplay(holder);  // <9>

  camera.setPreviewCallback(new PreviewCallback() { // <10>
    // Called for each frame previewed
    public void onPreviewFrame(byte[] data, Camera camera) {  // <11>
      Log.d(TAG, "onPreviewFrame called at: " + System.currentTimeMillis());
      Preview.this.invalidate();  // <12>
     }
   });
 } catch (IOException e) { // <13>
  e.printStackTrace();
   }
  }

 // Called when the holder is destroyed
public void surfaceDestroyed(SurfaceHolder holder) {  // <14>
camera.stopPreview();
camera = null;
}

// Called when holder has changed
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { // <15>
  camera.startPreview();
 }

}

-----------------相机活动------------------------

preview = new Preview(this); // <3>
((FrameLayout) findViewById(R.id.preview)).addView(preview); // <4>

buttonClick = (Button) findViewById(R.id.buttonClick);
buttonClick.setOnClickListener(new OnClickListener() {
  public void onClick(View v) { // <5>

      preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);
  }
});

// Handles data for jpeg picture
PictureCallback jpegCallback = new PictureCallback() { // <8>
public void onPictureTaken(byte[] data, Camera camera) {
  FileOutputStream outStream = null;
  try {
    // Write to SD Card

    outStream = new FileOutputStream(imgPath); // <9>
    outStream.write(data);
    outStream.close();
    intImg = new Intent(CameraActivity.this, DisplayImg.class);
    intImg.putExtra("imgPath",imgPath);
    startActivity(intImg);
    Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
  } catch (FileNotFoundException e) { // <10>
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
  }
  Log.d(TAG, "onPictureTaken - jpeg");
}
};
4个回答

14
如果您已经设置了自动对焦,您应该这样做:
camera.autoFocus(new AutoFocusCallback() {
        @Override
        public void onAutoFocus(boolean success, Camera camera) {
            if(success){
                camera.takePicture(shutterCallback, rawCallback, jpegCallback);
            }
        }
    });

这就是相机等待自动对焦的方式;)


1
自API 9以来,您可以通过以下方式(自动)实现自动对焦:
surfaceChanged()方法中,请进行以下更改:
    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

// Set camera properties first
Camera.Parameters parameters = camera.getParameters();
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        camera.setParameters(parameters);

camera.startPreview();

camera.autoFocus(null);
}


-1

你可以在拍照之前使用它。

preview.camera.autoFocus(null) // you can make optional callback once focus is achieved
preview.camera.takePicture(shutterCallback, rawCallback, jpegCallback);

在表面更改和预览之前,您可以使用自动对焦设置,它会自动设置焦距,然后开始预览,并对显示的任何内容进行自动对焦。
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

// Set camera properties first
Camera.Parameters parameters = camera.getParameters();
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
        camera.setParameters(parameters);

camera.startPreview();

camera.autoFocus(null);
}

在拍照之前,您必须等待焦点。否则它是无用的。 - Kasas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接