76

How can I display an Activity or Dialog to be visible over the lock screen?

I have already tried displaying my lock activity when screen turns on by setting various window type in Activity.onCreate() method:

TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_KEYGUARD

and others together with SYSTEM_ALERT_WINDOW and INTERNAL_SYSTEM_WINDOW permissions.

My activity is visible after I unlock the device.

UPDATE:

I actually already managed to display my own Activity instead of default lock screen. It work perfectly unless you use HOME button.

Steve Blackwell
  • 5,904
  • 32
  • 49
plugmind
  • 7,926
  • 4
  • 34
  • 39

4 Answers4

124
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED|
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

try using this flags to disable lock screen when the activity is started.

After API level 17 you can use

<activity
        android:name=".yourActivityName"
        android:showOnLockScreen="true"
        android:screenOrientation="sensorPortrait" >

showOnLockScreen like in the example...

Enes
  • 2,225
  • 1
  • 19
  • 16
  • 5
    this doesn't even require any permissions. Surprising. – Someone Somewhere Apr 27 '14 at 07:22
  • 4
    not working in my case, is any special permission needed for this? – Shirish Herwade May 20 '14 at 11:40
  • 7
    The thing is that at least on 4.4 this does not work when there is a password set on the lock screen. does anyone know how to keep the lock screen on but still be able to display the dialogue over it? – Habeeb Ahmed Sep 04 '14 at 14:19
  • 2
    Does anyone know how to deny home button in in case of custom activity for lock screen? Home button simply closes the activity and brings to home screen. – X-HuMan Nov 03 '14 at 23:15
  • @karate There is Screen Pinning - http://developer.android.com/about/versions/android-5.0.html, but it does not seem to be very easy to use (the app must have Device Owner permissions) –  May 06 '16 at 02:50
33

Don't go for activity, because android will not show lock screen behind your activity for security reason, so use service instead of Activity.

Below is my code in onStartCommand of my service.

WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

View mView = mInflater.inflate(R.layout.score, null);

WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
/* | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON */,
PixelFormat.RGBA_8888);

mWindowManager.addView(mView, mLayoutParams);

And add <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> to manifest

Shirish Herwade
  • 11,461
  • 20
  • 72
  • 111
  • 1
    I could use this to show the layout on top of the display. But it is not receiving events, even if I add event handlers. How to overcome that problem? – nagylzs Aug 24 '15 at 13:27
  • @nagylzs it will not receive events, because it's a compromise to be able to show your apps screen(which is not a system app) on lock screen. It's security issue. Generally Android didn't allow you to show your screen on lock screen having touch events,(e.g. you can steal some ones passwords by showing a transparent screen on lock screen) – Shirish Herwade Oct 27 '15 at 09:56
  • 1
    did you try using TYPE_SYSTEM_ERROR so that you can receive events? – Vivek MVK Sep 18 '16 at 12:43
  • The layout over lockscreen is not **showing in full screen** that is not covering the whole mobile screen.what to do for covering the **whole mobile screen** – Sabari Karthik Jan 07 '17 at 10:07
  • layout.score not found please help. – TAHA SULTAN TEMURI Feb 09 '17 at 08:51
  • Can you explain what you mean by "android will not show lock screen behind your activity for security reason" given that other answers show how to use an activity and it works just fine? What is the benefit of this approach compared to the others? – Michael Jan 18 '19 at 16:30
19

Use this in onCreate method

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);  
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 
// This line should be before setContentView..      
setContentView(......);

Hope this will work Thanks

Sarwar Hasan
  • 1,561
  • 2
  • 17
  • 25
0

You can use code in any of answers here that you think it's working. Then to prevent HOME button to work, change TYPE_SYSTEM_ALERT or TYPE_SYSTEM_OVERLAY (depends on what you currently use) to TYPE_SYSTEM_ERROR:

params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.MATCH_PARENT,
    WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
    WindowManager.LayoutParams.FLAG_FULLSCREEN | 
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | 
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,
    PixelFormat.TRANSLUCENT
);
params.gravity = Gravity.TOP;
mOverlay = (RelativeLayout) inflater.inflate(R.layout.main, (ViewGroup) null);
mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(mOverlay, params);
JJD
  • 50,076
  • 60
  • 203
  • 339
A. N
  • 153
  • 1
  • 15