quitar pantalla ocultar notificaciones notificacion mensajes mensaje los las como bloqueo barra activo android facebook notifications lockscreen

ocultar - Android de notificación de bloqueo de pantalla de Facebook



notificaciones de whatsapp en pantalla de bloqueo (2)

Creo que probablemente esté usando el mismo truco que el Chat encabeza las burbujas de Messenger.

Básicamente, usted usa este permiso "android.permission.SYSTEM_ALERT_WINDOW" para mostrar sus vistas sobre otras aplicaciones.

No lo he intentado, pero estoy bastante seguro de que usaron esto.

De los documentos "Permite que una aplicación abra ventanas utilizando el tipo TYPE_SYSTEM_ALERT, que se muestra sobre todas las demás aplicaciones". http://developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW

En la última versión de la aplicación de Android, Facebook mostró la función de notificación de bloqueo de pantalla, como en esta captura de pantalla:

¿Alguien trató de implementar esto?

Sé que es simple mostrar la Actividad en la parte superior de la pantalla de bloqueo, pero desafortunadamente no funciona con un fondo translúcido. Básicamente funciona, pero debajo de nuestra actividad vemos la pantalla de inicio, no la pantalla de bloqueo (como la pantalla de bloqueo en este caso también sería transparente).

Lo que intenté ahora es:

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

en mi actividad.

También probé este ejemplo: https://gist.github.com/daichan4649/5352944

Y como describí, todo funciona pero no hay transparencia.

Desde mi observación, Facebook usa el tema:

@android:style/Theme.Translucent.NoTitleBar

y no tiene permiso:

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

También me di cuenta de que la notificación de bloqueo de pantalla recibe toques, por lo que no podemos mostrar notificaciones desde la barra de estado por gesto.

Cualquier idea de cómo crear ese tipo de notificación antes del lanzamiento de Android L.


En realidad, ferdy182 estaba / está en algo.

Esto es lo que obtuve al usar android.permission.SYSTEM_ALERT_WINDOW :

Por lo tanto, no podría hacer esto con una Activity . Simplemente no funcionaría. Tuve que implementar un Service que agregó una View utilizando el WindowManager .

Un posible flujo de trabajo sería: BroadcastReceiver recibe una BroadcastReceiver => inicia un Servicio => el Servicio agrega la vista requerida.

Ahora, el código (los comentarios explican algunas cosas):

public class MyService extends Service { View mView; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); // instance of WindowManager WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); // inflate required layout file mView = mInflater.inflate(R.layout.abc, null); // attach OnClickListener mView.findViewById(R.id.some_id).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // you can fire an Intent accordingly - to deal with the click event // stop the service - this also removes `mView` from the window // because onDestroy() is called - that''s where we remove `mView` stopSelf(); } }); // the LayoutParams for `mView` // main attraction here is `TYPE_SYSTEM_ERROR` // as you noted above, `TYPE_SYSTEM_ALERT` does not work on the lockscreen // `TYPE_SYSTEM_OVERLAY` works very well but is focusable - no click events // `TYPE_SYSTEM_ERROR` supports all these requirements WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0, WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, 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); // finally, add the view to window mWindowManager.addView(mView, mLayoutParams); } @Override public void onDestroy() { super.onDestroy(); // remove `mView` from the window removeViewFromWindow(); } // Removes `mView` from the window public void removeNow() { if (mView != null) { WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.removeView(mView); } } }

Y finalmente, agregue el permiso al manifiesto de su aplicación:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />