59

¿Cómo puedo mostrar un Activity o Dialog para que esté visible en la pantalla de bloqueo?Actividad de Android en la pantalla de bloqueo predeterminada

ya he intentado mostrar mi actividad de bloqueo cuando la pantalla se enciende mediante el establecimiento de varios tipos de ventana en Activity.onCreate() método:

TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_KEYGUARD

y otros, junto con SYSTEM_ALERT_WINDOW y INTERNAL_SYSTEM_WINDOW permisos.

Mi actividad es visible después de desbloquear el dispositivo.

ACTUALIZACIÓN:

que en realidad ya arreglé para mostrar mi propia actividad en lugar de la pantalla de bloqueo predeterminado. Funciona perfectamente a menos que use el botón HOME.

+1

¿Qué es exactamente estás tratando de lograr? ¿Está intentando implementar su propia pantalla de bloqueo o quiere que su ventana de alerta se muestre en la pantalla de bloqueo (lo que sea que esté) o ...? –

+1

En realidad, me gustaría poder implementar ambas: una pantalla de bloqueo y un cuadro de diálogo sobre la pantalla de bloqueo existente. – plugmind

+0

Te puedo decir sobre mostrar una ventana en la pantalla de bloqueo: ver http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_SHOW_WHEN_LOCKED –

Respuesta

104
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); 

intente utilizar estos indicadores para deshabilitar la pantalla de bloqueo cuando se inicia la actividad.

Después del nivel 17 API puede utilizar

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

showOnLockScreen como en el ejemplo ...

+2

esto ni siquiera requiere ningún permiso. Sorprendente. –

+4

no funciona en mi caso, ¿se necesita algún permiso especial para esto? –

+5

El problema es que al menos en 4.4 esto no funciona cuando hay una contraseña establecida en la pantalla de bloqueo. ¿Alguien sabe cómo mantener encendida la pantalla de bloqueo pero aún así poder mostrar el diálogo sobre ella? –

17

Utilice este método en onCreate

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(......); 

la esperanza que esto funcionará Gracias

+0

cómo evitar la visualización mientras suena el teléfono. timbre de alarma, etc. – Subha

26

No vaya a la actividad, porque Android no mostrará la pantalla de bloqueo detrás de su actividad por razones de seguridad, por lo tanto, use el servicio en lugar de la actividad.

A continuación se muestra mi código en onStartCommand de mi servicio.

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); 

Y añadir <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> manifestar

+2

¡Muchas gracias! –

+1

Gracias MUCHO hombre ... –

+1

Podría usar esto para mostrar el diseño en la parte superior de la pantalla. Pero no está recibiendo eventos, incluso si agrego controladores de eventos. ¿Cómo superar ese problema? – nagylzs

0

Puede utilizar el código en cualquiera de respuestas aquí que cree que está funcionando. A continuación, para evitar INICIO botón para trabajar, el cambio TYPE_SYSTEM_ALERT o TYPE_SYSTEM_OVERLAY (depende de lo que se utiliza actualmente) a 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); 
Cuestiones relacionadas