三星Galaxy S5相机手电筒无法正常工作

时间:2015-01-26 23:23:31

标签: android android-camera params

我们的应用程序适用于所有支持的Android手机"除了三星Galaxy S5" 。我们的应用程序使用相机近距离拍照。 我们在整个拍摄时都需要手电筒模式。我们检查支持的参数并设置值(如果支持)。

params设置但事件永远不会被触发或相机忽略我的设置。我使用OpenCamera进行了测试,他们的应用程序可以打开火炬,但我找不到我如何设置我的参数与他们设置他们的方式之间的区别。

这是我们的代码:

//Set all camera parameters(flash, focus, white balance, etc)
private void setCameraParameters()
{
    //Rotate the orientation of the preview to match orientation of device
    camera.setDisplayOrientation(getCameraRotation());

    //A Parameters object must be used to set the other parameters.
    Parameters params = camera.getParameters();

        //Flash Mode to Torch if supported
        if(params.getSupportedFlashModes().contains("torch"))
        {
            // Torch mode
            params.setFlashMode(Parameters.FLASH_MODE_TORCH);
        }

        //Focus Mode to Macro if supported, Auto if not
        if(params.getSupportedFocusModes().contains("macro"))
        {
            //Macro focus mode
            params.setFocusMode(Parameters.FOCUS_MODE_MACRO);
        }
        else
        {
            //Auto focus mode
            params.setFocusMode(Parameters.FOCUS_MODE_AUTO);
        }


        //White Balance mode to Auto if available.
        List<String> supported_white = params.getSupportedWhiteBalance();
        if(supported_white!=null)
        {
            if(supported_white.contains("auto"))
            {
                params.setWhiteBalance(Parameters.WHITE_BALANCE_AUTO);
            }
        }

        // Auto Exposure Lock to false if available 
        if(params.isAutoExposureLockSupported())
        {
            params.setAutoExposureLock(false);
        }

        // Auto White Balance Lock if available. 
        if(params.getAutoWhiteBalanceLock())
        {
            params.setAutoWhiteBalanceLock(false);
        }

        //JPEG quality set to 100(highest)
        {
            params.setJpegQuality(100);
        }

        //Set focus area and metering area
        List<Camera.Area> focusArea = calculateFocusArea();
        params.setFocusAreas(focusArea);
        params.setMeteringAreas(focusArea);
        Camera.Size size = pickCameraSize(params.getSupportedPictureSizes());
        params.setPictureSize(size.width, size.height);

    //Set new parameters for camera
    camera.setParameters(params);

    boolean torch = getTorchState(camera);
}

// Added this method from zxing github to see if the value is being set
boolean getTorchState(Camera camera) {
    if (camera != null) {
        Camera.Parameters parameters = camera.getParameters();
        if (parameters != null) {
            String flashMode = camera.getParameters().getFlashMode();
            return flashMode != null
                    && (Camera.Parameters.FLASH_MODE_ON.equals(flashMode) || Camera.Parameters.FLASH_MODE_TORCH
                            .equals(flashMode));
        }
    }
    return false;
}

2 个答案:

答案 0 :(得分:1)

我做的有点不同......也许它会帮助你!

                params = getCamera().getParameters();
    ...

                //Check if device supports torch mode, If YES then enable
                List<String> supportedFlashModes = params.getSupportedFlashModes();
                if (supportedFlashModes != null && supportedFlashModes.contains(Parameters.FLASH_MODE_TORCH)){
                    params.setFlashMode(Parameters.FLASH_MODE_TORCH);
                    torchModeOn  = true;
                }
...

                getCamera().setParameters(params);

相比之下我使用Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE并且不使用setFocusAreas,setMeteringArea,setAutoWhiteBalanceLock,setWhiteBalance或setAutoExposureLock。

看到你的代码之后,我试图将每一个单独合并,看看它是否会更好地影响我的照片,没有运气。 (我的应用程序也需要特写图片。

在我尝试使用的任何设备上,参数.FOCUS_MODE_MACRO都不适合我。

编辑:

以下是我设置相机的顺序,这有助于...

        setCameraDisplayRotation();

        params = getCamera().getParameters();

        setFocusMode();

        //Check if device supports torch mode, If you YES then set on
        List<String> supportedFlashModes = params.getSupportedFlashModes();
        if (supportedFlashModes != null && supportedFlashModes.contains(Parameters.FLASH_MODE_TORCH)){
            params.setFlashMode(Parameters.FLASH_MODE_TORCH);
            torchModeOn  = true;
        }

        setImageResolution();

        getCamera().setParameters(params); // update params before preview.setCamera
        preview.setCamera(getCamera());   

        //... some custom code for determining the current screens available space for the preview

        params.setPreviewSize(size.width, size.height);

        if(setHiddenParameter(params, "zsl-values", "zsl", "on")){
            setUsingZsl(true);
        };

        getCamera().setParameters(params); //update params after preview init

答案 1 :(得分:1)

你必须在Android Lollipop中使用新的camera2 API

<强> Sample Code github

developer site