【问题标题】:How to turn off Flash light of Camera with use Night scene, when take a picture in Android?在Android中拍照时如何使用夜景关闭相机的闪光灯?
【发布时间】:2017-10-27 05:57:49
【问题描述】:

问题:当我将场景模式设置为SCENE_MODE_NIGHT时,当我调用takePicture()方法时,闪光灯无法设置为关闭。

伪:

Camera mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK)
Camera.Parameters params = camera.getParameters();

//AUTO-FOCUS
List<String> focus = params.getSupportedFocusModes();
if (focus != null && focus.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)
     params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);

//AUTO NIGHT SCENE
List<String> scene = params.getSupportedSceneModes();
if (scene != null && scene.contains(Camera.Parameters.SCENE_MODE_NIGHT)){
    params.setSceneMode(Camera.Parameters.SCENE_MODE_NIGHT);
}

//FLASH
List<String> flash = params.getSupportedFlashModes();
if(flash != null && flash.contains(Camera.Parameters.FLASH_MODE_OFF)) {
    params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
}

mCamera.setParameters(params);
mPreview = new CameraPreview(this, mCamera, params); //surfaceView (CameraPreview extends SurfaceView implements SurfaceHolder.Callback)

打电话拍照:

if(params.isVideoSnapshotSupported()){//Some device not supported this mode
     mCamera.takePicture(null, null, new Camera.PictureCallback(){
     ...
}

权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" /> <!--somewhere i find this strange permission, but still not working-->

Logcat 正确显示:params.getFlashMode(): 关闭,但会触发闪光灯。
Logcat (Nexus 5) 显示:I/mm-jpeg-intf: process_sensor_data: Flash value 1 flash mode 4 flash state 3 在调用 mCamera.takePicture 之后。

当我评论行时params.setSceneMode(Camera.Parameters.SCENE_MODE_NIGHT);(或更改为Camera.Parameters.SCENE_MODE_AUTO)flash 不会触发。
Logcat (Nexus 5) 显示:I/mm-jpeg-intf: process_sensor_data: Flash value 0 flash mode 0 flash state 2 在调用 mCamera.takePicture 之后。

目标:同时使用这些参数:SCENE_MODE_NIGHTFLASH_MODE_OFF
使用:Android 相机 1 API。后置摄像头。
出现:Android 6,7,也可能是 Android 5。
已测试

  • Nexus 5:不行。
  • 华为荣耀4C:好的

可能是 Nexus 5 的“错误”,因为我尝试从 Google Play 打开相机应用程序,将场景设置为夜间,禁用闪光灯,但拍照时闪光灯仍然处于活动状态。

【问题讨论】:

    标签: android android-camera flashlight camera-flash


    【解决方案1】:
    use the below code on onClick of flash on and flash off Button
    /**
     * Action to be performed when image is capture is clicked
     */
    private OnClickListener OnFlashClick = new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if(btn_cameraFlashOn.isSelected())
            {
                btn_cameraFlashOn.setSelected(false);
    
                mCamUtils.setFlashParams(Parameters.FLASH_MODE_OFF);
            }
            else
            {
                btn_cameraFlashOn.setSelected(true);
    
                mCamUtils.setFlashParams(Parameters.FLASH_MODE_TORCH);
            }
    
    
        }
    };
    private OnClickListener OffFlashClick = new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            mCamUtils.toggleFlashSettings();
        }
    };
    
    private String mFlashSetting = null;
    /**
     * Set the flash mode for camera
     */
    public void toggleFlashSettings()
    {
    
    
        if (null == mCamera)
        {
            return;
        }
    
        Camera.Parameters params = mCamera.getParameters();
        List<String> flashModes = params.getSupportedFlashModes();
    
        if (flashModes == null)
        {
            mCallback.enableFlashButton(false);
            return;
        }
        else
        {
            mCallback.enableFlashButton(true);
        }
    
        //      Log.d(LOGTAG, " mFlashSetting mode = " + mFlashSetting);
    
        if ((Camera.Parameters.FLASH_MODE_AUTO.equals(mFlashSetting))
                && (flashModes.contains(Camera.Parameters.FLASH_MODE_ON)))
        {
            setFlashParams(Camera.Parameters.FLASH_MODE_ON);
    
        } else if ((Camera.Parameters.FLASH_MODE_ON.equals(mFlashSetting))
    
                && (flashModes.contains(Camera.Parameters.FLASH_MODE_OFF)))
        {
            setFlashParams(Camera.Parameters.FLASH_MODE_OFF);
    
        }
        else if (flashModes.contains(Camera.Parameters.FLASH_MODE_AUTO))
        {
            setFlashParams(Camera.Parameters.FLASH_MODE_AUTO);
        }
    
    }
    
    /**
     * Returns the current flash setting of the device
     *
     * @return
     */
    public String getFlashMode()
    {
        if (null == mCamera)
        {
            return null;
        }
    
        mFlashSetting = mCamera.getParameters().getFlashMode();
    
        return mFlashSetting;
    }
    
    /**
     * Sets the flash mode of the camera. this is a internal method only
     *
     * @return
     */
    public void setFlashParams(String flash)
    {
    
        if (null == mCamera)
        {
            return;
        }
    
        Camera.Parameters params = mCamera.getParameters();
        List<String> flashModes = params.getSupportedFlashModes();
    
        if (flashModes == null)
        {
            mCallback.enableFlashButton(false);
            return;
        }
        else
        {
            mCallback.enableFlashButton(true);
        }
    
        if (flashModes.contains(flash))
        {
            mFlashSetting = flash;
            params.setFlashMode(flash);
            mCallback.flashSet(flash);
            mCamera.setParameters(params);
    
            //      Log.d(LOGTAG, " new flash mode = " + flash);
    
        }
        else
        {
            //      Log.e(LOGTAG, " INVALID FLASH MODE");
        }
    }
    

    【讨论】:

    • @t0m 以上代码用于在使用相机时打开和关闭闪光灯。由于更改现有相机类中的代码有点困难。因此,如果您遇到任何困难,请告诉我。
    • 我一般不需要打开/关闭闪光灯。当我调用mCamera.takePicture() 方法时,目标是使用 SCENE_MODE_NIGHT 和 FLASH_MODE_OFF。
    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多