0

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.

t0m
  • 3,004
  • 31
  • 53

1 Answers1

0
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");
    }
}
yash786
  • 1,151
  • 8
  • 18
  • @t0m Above code is for turning on and off of flash while using camera. As changing the code in existing camera class is bit difficult. so if you face any difficulty please let me know. – yash786 Oct 27 '17 at 06:41
  • I do not need to turn On/Off flash in general. Goal is use SCENE_MODE_NIGHT with FLASH_MODE_OFF when i call `mCamera.takePicture()` method. – t0m Oct 27 '17 at 06:48