How to turn off Flash light of Camera with use Night scene, when take a picture in Android?

1k Views Asked by At

Problem: When i set scene mode to SCENE_MODE_NIGHT, flash cannot be set to Off when i call takePicture() method.

Pseudo:

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)

Call take a picture:

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

Permissions:

<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 shows correctly: params.getFlashMode(): off, but flash is fired.
Logcat (Nexus 5) shows: I/mm-jpeg-intf: process_sensor_data: Flash value 1 flash mode 4 flash state 3 after call mCamera.takePicture.

When i comment line: params.setSceneMode(Camera.Parameters.SCENE_MODE_NIGHT); (or change to Camera.Parameters.SCENE_MODE_AUTO) flash is not fired.
Logcat (Nexus 5) shows: I/mm-jpeg-intf: process_sensor_data: Flash value 0 flash mode 0 flash state 2 after call mCamera.takePicture.

Goal: Use these parameters: SCENE_MODE_NIGHT, FLASH_MODE_OFF together.
Use: Android Camera 1 API. Back camera.
Ocurrence: Android 6,7, maybe Android 5 too.
Tested:

  • Nexus 5: NOT OK.
  • Huawei Honor 4C: OK

Probably it's Nexus 5 "bug" because i tried Open Camera application from Google Play, set scene to night, disable flash, but flash is still active while take a picture.

1

There are 1 best solutions below

2
yash786 On
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");
    }
}