【问题标题】:How to fix setParameters Failed in Android.harware.Camera?如何修复 Android.harware.Camera 中的 setParameters 失败?
【发布时间】: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 错误...

【问题讨论】:

    标签: android-camera face-detection


    【解决方案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问题......但感谢您提供建议
      • 好的,没问题,祝你好运! :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多