创建相机视图后Android自动对焦不起作用

Posted

技术标签:

【中文标题】创建相机视图后Android自动对焦不起作用【英文标题】:Android Auto focus doesn't work after creating camera view 【发布时间】:2016-04-02 02:40:15 【问题描述】:

我正在尝试创建自己的相机视图,除了自动对焦外,我什么都可以正常工作,我似乎无法弄清楚为什么它不起作用。这是我的 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" />

【问题讨论】:

你能修正你的代码格式吗?你现在获得的荣誉有点不清楚。 @BobKruithof 这样更好吗? 【参考方案1】:

如果您在清单中添加了&lt;uses-feature android:name="android.hardware.camera.autofocus" /&gt;,这并不意味着相机会生成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();


您可以在这些focus parameters之间进行选择:

字符串 FOCUS_MODE_AUTO 自动对焦模式。

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

字符串 FOCUS_MODE_CONTINUOUS_VIDEO 连续自动对焦模式 用于视频录制。

字符串 FOCUS_MODE_EDOF 扩展景深 (EDOF)。

字符串 FOCUS_MODE_FIXED 焦点已修复。

String FOCUS_MODE_INFINITY 焦点设置为无穷远。

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

【讨论】:

嗨,克里斯,如果我的应用程序中实际上没有 Java 代码,我应该将强制自动对焦的代码放在哪里?我正在使用 Unity3D 应用程序 (C#),该应用程序(当部署到 Android Galaxy 平板电脑时)扫描序列号,但平板电脑的摄像头无法自动对焦。因此,您在 AndroidManifest 中将该行仅允许使用该功能的评论提供了丰富的信息,因为以前我认为这会强制使用它。我在 Unity 项目中只有一堆 C# 脚本。我应该将此类特定于 Android 的代码放在哪里来强制相机对焦? @Joshua 抱歉,但我对 Unity3D 的了解为零,所以我认为我无法为您提供帮助。我认为 Unity API 不同于 android。也许您应该针对您的问题提出一个新问题。 谢谢@ChrisRock。这对我有帮助。 uses-feature 与 uses-permission 不同。 “Google Play 使用您的应用清单中声明的​​ 元素从不满足其硬件和软件功能要求的设备中过滤您的应用。”【参考方案2】:
//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);

【讨论】:

您好,我应该同时拥有以下两个还是只有一个? &lt;uses-feature android:name="android.hardware.camera" android:required="true"/&gt;&lt;uses-feature android:name="android.hardware.camera2.full"/&gt;【参考方案3】:

这里有一些选项:

    用户arsalank2 建议使用this answer 中所述的“连续自动对焦”。但是,似乎某些 HTC 设备不支持此功能。检查: parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTIN‌​UOUS_VIDEO)

    您可以实现onSensorChanged 侦听器并在满足某些条件时通过回调聚焦see this answer Juan Acevedo。

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

我建议使用选项 3,因为似乎没有适用于每台设备的方法。

【讨论】:

以上是关于创建相机视图后Android自动对焦不起作用的主要内容,如果未能解决你的问题,请参考以下文章

输入文本中的焦点或自动对焦在 Firefox 16.0.2 中不起作用

Angular Bootstrap 模态弹出自动对焦不起作用

iOS webview自动对焦在键盘打开时不起作用

Android 4.4.2 - 相机 uri 返回 null 并且裁剪功能也不起作用?

如何实现Android手机摄像头的自动对焦

是否能关闭android手机的自动对焦功能??