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" />