创建摄像机视图后,Android自动对焦功能无效

Suj*_*uji 6 java android android-camera

我正在尝试创建自己的相机视图,除了自动对焦之外我还能正常工作,我似乎无法弄清楚为什么它不起作用.这是我的CameraView.java代码

public class CameraView extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder surface_Holder;
    private  Camera main_Camera;
    boolean on;

    public CameraView(Context context, Camera camera){
        super(context);
        main_Camera = camera;
        main_Camera.setDisplayOrientation(90);
        surface_Holder = getHolder();
        surface_Holder.addCallback(this);
        surface_Holder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
    }

    public boolean isOn(){
        return on;
    }


    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        try{
            main_Camera.setPreviewDisplay(holder);
            main_Camera.startPreview();
        }catch (Exception e){
            Log.d("Error", "Canmera error on surfaceCreated" + e.getMessage());
            main_Camera.release();
            main_Camera = null;
        }

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        if(holder.getSurface()==null){
            return;
        }
        try{
            main_Camera.stopPreview();
        }catch (Exception e){

        }
        try{

            main_Camera.setPreviewDisplay(surface_Holder);
            main_Camera.startPreview();
        }catch (IOException e){
            Log.d("Error", "Camera error on surfaceChanged " + e.getMessage());
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        main_Camera.setPreviewCallback(null);
        main_Camera.stopPreview();
        main_Camera.release();
        main_Camera= null;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的清单中,我有以下内容:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 9

如果你添加<uses-feature android:name="android.hardware.camera.autofocus" />到你的清单,它并不意味着相机会autofocus.这意味着您允许您的应用程序使用相机硬件或处理自动对焦的软件.

声明的目的是通知任何外部实体您的应用程序所依赖的硬件和软件功能集.

要将相机设置为焦点,可以将此方法添加到您的CameraView班级:

private void setFocus(String mParameter) {
    Camera.Parameters mParameters = mCamera.getParameters();
    mParameters.setFocusMode(mParameter);
    mCamera.setParameters(mParameters);
}
Run Code Online (Sandbox Code Playgroud)

然后surfaceChanged()像这样调用此方法:

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

    ...//your code here

    // Set focus mode to continuous picture
    setFocus(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);

    // Start camera preview
    mCamera.startPreview();

}
Run Code Online (Sandbox Code Playgroud)

你可以选择focus parameters:

String FOCUS_MODE_AUTO自动对焦模式.

String FOCUS_MODE_CONTINUOUS_PICTURE用于拍摄照片的连续自动对焦模式.

String FOCUS_MODE_CONTINUOUS_VIDEO用于视频录制的连续自动对焦模式.

String FOCUS_MODE_EDOF扩展景深(EDOF).

字符串FOCUS_MODE_FIXED焦点是固定的.

String FOCUS_MODE_INFINITY焦点设置为无穷大.

String FOCUS_MODE_MACRO宏(特写)对焦模式.


小智 5

//set camera to continually auto-focus
Camera.Parameters params = c.getParameters();
//*EDIT*//params.setFocusMode("continuous-picture");
//It is better to use defined constraints as opposed to String, thanks to AbdelHady
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
c.setParameters(params);
Run Code Online (Sandbox Code Playgroud)


hal*_*.am 0

以下是一些选项:

\n\n
    \n
  1. 用户arsalank2建议使用“连续自动对焦”,如此答案中所述。不过,似乎某些 HTC 设备不支持此功能。检查:\nparameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTIN\xe2\x80\x8c\xe2\x80\x8bUOUS_VIDEO)

  2. \n
  3. 您可以实现一个onSensorChanged侦听器,并在满足某些条件时通过回调来聚焦,请参阅Juan Acevedo回答

  4. \n
  5. 以不同的方式处理每种情况,以支持尽可能广泛的设备。检查哪些内容适用于不同设备的不同型号,因为您不能完全依赖 API 级别所说的实现内容。

  6. \n
\n\n

我建议使用选项 3,因为似乎没有一种方法适用于所有设备。

\n