通过触摸设置安卓手动对焦

9

我将通过打开相机并通过触摸屏幕上的点启用手动对焦来设置我的Android应用程序。相机可以重新对焦到我在屏幕上指向的点。你能告诉我修改的方法或者应该从哪个组件开始修改吗?

以下是我的代码:

public void takePhoto(File photoFile, String workerName, int width, int height, int quality) {
    if (getAutoFocusStatus()){
        camera.autoFocus(new AutoFocusCallback() {
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                camera.takePicture(shutterCallback, rawCallback, jpegCallback);
            }
        }); 
    }else{
        camera.takePicture(shutterCallback, rawCallback, jpegCallback);
    }

this.photoFile = photoFile;
this.workerName = workerName;
this.imageOutputWidth = width;
this.imageOutputHeight = height;
}

public void takePhoto(File photoFile, int width, int height, int quality) {
takePhoto(photoFile, null, width, height, quality);
}

我相信你想要的是所谓的“辅助”对焦。手动对焦是不可能的:http://android.stackexchange.com/questions/2042/can-i-manually-focus-the-camera-on-my-android-phone (至少几年前是这样)。 - AnnanFay
3个回答

14
尽管这个答案没有展示如何聚焦在一个单一的区域,但它确实有用,因为它展示了如何准确地开始对焦相机。
这是我所做的。 这在我的设备上(HTC的Droid DNA),使用Android Studio构建可行。
OnSurfaceChanged()OnSurfaceCreated()中,我有以下代码:(mCamera是我的私有Camera对象)
        mCamera.stopPreview();
        Camera.Parameters p = mCamera.getParameters();
        p.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);

        mCamera.setParameters(p);
        mCamera.setPreviewDisplay(surfaceHolder);
        mCamera.startPreview();
        mCamera.autoFocus(null);
在构造函数中,您必须放置 <\/p>
        setFocusable(true);
        setFocusableInTouchMode(true);

这将允许您接收焦点事件。至于如何捕获它们...

 public boolean onTouchEvent(MotionEvent event){
    if(event.getAction() == MotionEvent.ACTION_DOWN){
        Log.d("down", "focusing now");

        mCamera.autoFocus(null); 
    }

    return true;
}

1
在我看来,这个答案并没有解决问题,它只是将自动对焦设置为null。它并没有将相机对焦到所选点。 - Hugo
你是对的。此外,自API 21起,此相机API已被弃用。http://developer.android.com/reference/android/hardware/Camera.html - Nlinscott
这在KitKat上对我有效,如果你使用的是棒棒糖新相机API,则可能无法正常工作。 - Nlinscott

1

你尝试过使用setFocusAreas()方法来设置用户触摸的焦点区域吗?


0
关键在于调用camera.autoFocus(autoFocusCallBack)方法,并且在我们聚焦后调用autofocusCallback.onAutoFocus(boolean success, Camera camera)方法,然后调用camera.takePicture(Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg)方法。
更多信息请参见:http://achorniy.wordpress.com/2009/12/29/how-to-use-autofocus-in-android/ 或者
在surface changed和预览之前,您可以使用自动对焦设置来自动设置焦距,然后开始预览,然后对显示的内容进行自动对焦...
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);

}

来源:在 Android 相机类中放置自动对焦的位置


1
那么,如果我为触摸屏幕添加事件参数,然后再次调用AutoFocus,这样就解决了我的问题? - Jeff Bootsholz

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