如何修复 Android.harware.Camera 中的 setParameters 失败?

Posted

技术标签:

【中文标题】如何修复 Android.harware.Camera 中的 setParameters 失败?【英文标题】:How to fix setParameters Failed in Android.harware.Camera? 【发布时间】:2017-04-26 10:13:25 【问题描述】:

我在多个设备上都收到此错误,

设置参数失败

...在 android 中创建相机应用时。

是什么导致了这个问题?

这是我目前在打开 camera 设置 Parameters 时所做的:

   public void surfaceCreated(SurfaceHolder surfaceHolder ) 



        try 

                camera = camera.open();

         catch (Exception e) 
            Log.e(getString(R.string.app_name), "failed to open Camera");
            e.printStackTrace();
        


        try 

            camera.setPreviewDisplay(surfaceHolder);
            camera.startPreview();


        catch (Exception e)



        

    

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) 
        refreshCamera();
        setDisplayOrientation();

        Camera.Parameters parameters = camera.getParameters();

        camera.setFaceDetectionListener(faceDetectionListener);
        camera.startFaceDetection();
        parameters.setPreviewFrameRate(20);
        List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes();
        Camera.Size customSize = customSizes.get(0); //Added size
        parameters.setPreviewSize(customSize.width, customSize.height);
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        camera.setParameters(parameters);
        camera.setDisplayOrientation(90);

        camera.setParameters(parameters);
        camera.startPreview();





    

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) 
        if (camera != null) 
            camera.stopPreview();
        

    




    public void frontCamera(View view) 

        camera.stopPreview();
        camera.release();
        camera=null;

        if (cameraId == 0)



            try 

                camera = camera.open(1);

             catch (Exception e) 
                Log.e(getString(R.string.app_name), "failed to open Camera");
                e.printStackTrace();
            
            android.hardware.Camera.Parameters parameters;
            camera.setFaceDetectionListener(faceDetectionListener);
            camera.startFaceDetection();
            parameters = camera.getParameters();
            parameters.setPreviewFrameRate(20);
            List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes();


            Camera.Size customSize = customSizes.get(0); //Added size
            parameters.setPreviewSize(customSize.width, customSize.height);
            parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
            camera.setParameters(parameters);
            camera.setDisplayOrientation(90);

            cameraId = 1;


            try 

                camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();


            catch (Exception e)



            
        

+我尝试在互联网上进行研究,发现:

  List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes();


            Camera.Size customSize = customSizes.get(0); //Added size
            parameters.setPreviewSize(customSize.width, customSize.height);

但仍然导致setParameters 错误...

【问题讨论】:

【参考方案1】: 您知道有问题的相机支持 FOCUS_MODE_CONTINUOUS_PICTURE 吗? 不能保证。检查getSupportedFocusModes()。如果您使用任何类型的不受支持的模式,相机可能会失败 setParameters。 您知道相机支持 20 帧速率吗?这不能保证。检查getSupportedPreviewFpsRange。同样,如果您使用不支持的帧速率值,相机可能无法设置参数。 正如 Jan 所说,startFaceDetection() 应仅在预览开始后调用。老实说,尽管无序执行此操作会导致 setParameters 错误,这有点令人惊讶。

【讨论】:

【参考方案2】:

您的方法startFaceDetection()应该在预览开始后被调用,因为相机会通知Camera.FaceDetectionListener预览帧中检测到的人脸。

        parameters.setPreviewFrameRate(20);
        List<Camera.Size> customSizes = parameters.getSupportedPreviewSizes();
        Camera.Size customSize = customSizes.get(0); //Added size
        parameters.setPreviewSize(customSize.width, customSize.height);
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
        camera.setParameters(parameters);
        camera.setDisplayOrientation(90);

        camera.setParameters(parameters);
        camera.startPreview();

camera.setFaceDetectionListener(faceDetectionListener);
        camera.startFaceDetection();

【讨论】:

太棒了!但只是问,我应该使用 startPreview();和 camera.setParameters(parameters);里面 try and catch with like Exeption e 或 IOExeption e? 谢谢!给你! 它仍然有一些相同标题的错误......对不起,但这还没有解决cmy问题......但感谢您提供建议 好的,没问题,祝你好运! :)

以上是关于如何修复 Android.harware.Camera 中的 setParameters 失败?的主要内容,如果未能解决你的问题,请参考以下文章

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)

如何修复AppScan漏洞

如何在DOS环境下修复系统