Android Auto焦点在创建相机视图后无法工作

5

我正在尝试创建自己的相机视图,除了自动对焦之外,所有功能都已经实现。我无法弄清楚为什么自动对焦不起作用。这是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;
    }
}

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

<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" />

你能修复一下代码格式吗?现在花括号的放置有点不清晰。 - halfpastfour.am
1
@BobKruithof 这样好一点吗? - Suji
3个回答

11
如果您在清单文件中添加了<uses-feature android:name="android.hardware.camera.autofocus" />,并不意味着相机将进行自动对焦。这意味着您允许应用程序使用照相机硬件或软件来处理自动对焦。
声明的目的是通知任何外部实体您的应用程序所依赖的硬件和软件功能集。
要将相机设置为对焦,请将此方法添加到您的 CameraView 类中:
private void setFocus(String mParameter) {
    Camera.Parameters mParameters = mCamera.getParameters();
    mParameters.setFocusMode(mParameter);
    mCamera.setParameters(mParameters);
}

然后在 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();

}

你可以在这些焦点参数之间进行选择:

String FOCUS_MODE_AUTO 自动对焦模式。

String FOCUS_MODE_CONTINUOUS_PICTURE 连续自动对焦模式,适用于拍照。

String FOCUS_MODE_CONTINUOUS_VIDEO 连续自动对焦模式,适用于视频录制。

String FOCUS_MODE_EDOF 扩展景深(EDOF)。

String FOCUS_MODE_FIXED 焦点固定。

String FOCUS_MODE_INFINITY 焦点设置为无限远。

String FOCUS_MODE_MACRO 微距(特写)对焦模式。


嗨,Chris,如果我实际上没有Java代码,那么我应该把强制自动对焦的代码放在哪里?我正在使用Unity3D应用程序(C#)工作,当部署到Android Galaxy平板电脑时,它会扫描序列号,但平板电脑的相机不会自动对焦。因此,您的评论指出将该行放入AndroidManifest仅允许使用该功能是有启发性的,因为以前我认为这是强制使用它。我只有一个Unity项目中的一堆C#脚本。我应该把这样的特定于Android的代码放在哪里以强制相机对焦? - user285372
1
@Joshua 抱歉,但我对Unity3D一窍不通,所以我认为我无法帮助你解决问题。我认为Unity API与Android不同。也许你应该就你的问题开一个新的提问。 - Chris
谢谢@ChrisRock。那帮了我很多。 - iSofia
uses-feature不同于uses-permission。"Google Play使用在你的应用清单中声明的<uses-feature>元素来过滤那些不符合硬件和软件要求的设备,从而筛选你的应用程序。" - Gilles

4
//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);

你好,我应该同时拥有以下两个还是只需要一个? <uses-feature android:name="android.hardware.camera" android:required="true"/> <uses-feature android:name="android.hardware.camera2.full"/> - user285372

0
这里有一些选项:
  1. 用户 arsalank2 建议使用“连续自动对焦”,如 this answer 中所述。然而,似乎一些 HTC 设备不支持。请检查: parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTIN‌​UOUS_VIDEO)

  2. 你可以实现一个 onSensorChanged 监听器,并在满足某些条件时使用回调进行对焦,参见 this answerJuan Acevedo

  3. 针对不同的情况采用不同的处理方法以支持尽可能广泛的设备。检查在不同设备型号上的工作情况,因为不能完全依赖 API 级别所实现的功能。

我建议采用第三种选项,因为似乎没有一种方法适用于每个设备。


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