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

How to fix setParameters Failed in Android.harware.Camera?

我在多台设备上都遇到了这个错误,

setParameters Failed

...在 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 错误...

你的方法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();
  • 您知道有问题的相机支持 FOCUS_MODE_CONTINUOUS_PICTURE 吗? 不能保证。检查 getSupportedFocusModes()。如果您使用任何类型的不受支持的模式,相机可能无法设置参数。
  • 您知道相机支持 20 帧速率吗? 不能保证。检查 getSupportedPreviewFpsRange。同样,如果您使用不受支持的帧速率值,相机可能无法设置参数。
  • 而且,正如 Jan 所说,startFaceDetection() 应该仅在预览开始后调用 。老实说,乱序执行会导致 setParameters 错误有点令人惊讶。