21

I would like to unlock screen and switching it on to show a popup on an event trigger. I am able to unlock the screen using

newKeyguardLock = km.newKeyguardLock(HANDSFREE);
newKeyguardLock.disableKeyguard();

on KeyGuardService but I cannot turn on the screen. I am using

wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, HANDSFREE);
wl.acquire();

but with no success. The screen still remains off. How can I achieve this?

Vikasdeep Singh
  • 20,983
  • 15
  • 78
  • 104
Matroska
  • 6,885
  • 14
  • 63
  • 99

6 Answers6

36

Note from author: I wrote this back in 2012. I don't know if it works anymore. Be sure to check out the other more recent answers.


Amir's answer got me close, but you need the ACQUIRE_CAUSES_WAKEUP flag at least (Building against Android 2.3.3).

WakeLock screenLock = ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(
     PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
screenLock.acquire();

//later
screenLock.release();
undefined
  • 6,208
  • 3
  • 49
  • 59
10

This is very popular question but the accepted answer now is outdated.

Below is latest way to Turn On Screen OR wake up your device screen from an activity:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
    this.setTurnScreenOn(true);
} else {
    final Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}

Use WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON but FLAG_TURN_SCREEN_ON flag has been deprecated in API level 27 so you can use Activity.setTurnScreenOn(true) from API level 27 onward.

Vikasdeep Singh
  • 20,983
  • 15
  • 78
  • 104
3

In your main activity's OnCreate() write following code:

((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG").acquire();

It causes the device to wake up.

Do not forget disableKeyguard() to unlock the device...

Nikhil
  • 16,194
  • 20
  • 64
  • 81
Amir Dashti
  • 369
  • 3
  • 14
1

undefined's answer with NullPointer check and set timeout :

private void turnOnScreen() {
    PowerManager.WakeLock screenLock = null;
    if ((getSystemService(POWER_SERVICE)) != null) {
        screenLock = ((PowerManager)getSystemService(POWER_SERVICE)).newWakeLock(
                PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
        screenLock.acquire(10*60*1000L /*10 minutes*/);


        screenLock.release();
    }
}
hmir
  • 97
  • 2
  • 7
1

This is how you can do it:

PowerManager powerManager = (PowerManager) context.getSystemService(context.POWER_SERVICE);
    PowerManager.WakeLock  wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK |
            PowerManager.ACQUIRE_CAUSES_WAKEUP |
            PowerManager.ON_AFTER_RELEASE, "appname::WakeLock");

    //acquire will turn on the display
    wakeLock.acquire();

make sure to set permission in the manifest :

<uses-permission android:name="android.permission.WAKE_LOCK"/>
Amer Alzibak
  • 1,489
  • 15
  • 16
0

2023 working Kotlin version

I needed to modify this answer https://stackoverflow.com/a/50979446/10233647 a little bit, but finally managed to make it work!

Try simply:

val window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED)

This really wakes the screen, when it's locked!