0

I have this code to turn camera flash on and off in android:

 params = camera.getParameters();
 params.setFlashMode(Parameters.FLASH_MODE_TORCH);
 camera.setParameters(params);
 camera.startPreview();
 isFlashOn = true;

The problem appear if flash is on and user turn off screen. flash automatically turned off and return on when screen is on.

I need to keep flash on when screen off.

Any idea please?

Ahmed M. Abed
  • 599
  • 3
  • 9
  • 22

1 Answers1

0

Here is a link to the problem you're having. "The key is changing the state back to FLASH_MODE_OFF and then back to FLASH_MODE_TORCH."

In the solution, he creates a Timer Task to handle checking if the screen is on or not. He then turns off the flash and then back on.

Down below the linked solution is another solution which added a thread and made it go to sleep for 200 milliseconds before sending the torch command.

So I'd say the solution you're looking for is the combination of both solutions.

@Override
public void onCreate() {
    // assume we start with screen on and save that state ;-)
    this.pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    screenOn = this.pm.isScreenOn();

    // program a timer which checks if the light needs to be re-activated
    this.mTimer = new Timer();
    this.mTimerTask = new TimerTask() {
        public void run() {
            // re-activate the LED if screen turned off
            if(!pm.isScreenOn() && pm.isScreenOn() != screenOn) {
                Log.i("SleepLEDservice", "re-activated the LED");
                // really it's NOT ENOUGH to just "turn it on", i double-checked this
                setFlashlight(Camera.Parameters.FLASH_MODE_OFF);
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                setFlashlight(Camera.Parameters.FLASH_MODE_TORCH);
            }
            screenOn = pm.isScreenOn();                 
        }
    };
}

private void setFlashlight(String newMode) {
    try {
        this.frontCamPara = this.frontCam.getParameters();
        if(this.frontCamPara.getFlashMode() != newMode) {
            this.frontCamPara.setFlashMode(newMode);
            this.frontCam.setParameters(frontCamPara);  
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Again, credit should go to @stefanjunker and @BlueJam as their answers are referenced in this.

Community
  • 1
  • 1
Steven_BDawg
  • 796
  • 6
  • 21