programacion - notificationmanager android ejemplo
¿Cómo puedo abrir/cerrar notificaciones mediante programación en Android? (6)
¿Cómo puedo abrir / cerrar notificaciones mediante programación en Android?
Lo que quieres no se puede hacer usando el SDK de Android.
Sé que es posible porque todos los lanzadores de cuustomás pueden hacerlo presionando un botón (LauncherPro, ADW, etc.).
Todos los "lanzadores personalizados" están pasando por alto el SDK, utilizando una variación en la técnica que @Yoni Samlan propuso en otra respuesta a su pregunta. Las cosas que no son parte del SDK pueden ser eliminadas por los fabricantes de dispositivos, reemplazadas por el equipo central de Android en futuras versiones, etc.
Yo diría que lo que quieres debería ser posible a través del SDK; De lo contrario, realmente limita las implementaciones de pantalla de inicio alternativas. Sin embargo, lo que tú y yo queremos no cuenta mucho.
He buscado por todas partes, pero no puedo encontrar nada en el SDK o en Google sobre cómo hacer esto. Sé que es posible porque todos los lanzadores personalizados pueden hacerlo presionando un botón (LauncherPro, ADW, etc.).
Gracias.
Aquí está el método showNotifications del Iniciador de Android:
private void showNotifications() {
final StatusBarManager statusBar = (StatusBarManager) getSystemService(STATUS_BAR_SERVICE);
if (statusBar != null) {
statusBar.expand();
}
}
(que, como indicó Robby, es el servicio del sistema "barra de estado").
La respuesta de Ashwin funciona para las versiones de Android por debajo de 4.2.2 (es decir, por debajo de la versión 17). En 4.2.2, el método "expandir" se cambió a "expandNotificationsPanel". Si no usa ese nombre de método para 4.2.2 y superior, obtendrá una excepción de puntero nulo. Entonces el código debería ser:
Object sbservice = getSystemService( "statusbar" );
Class<?> statusbarManager = Class.forName( "android.app.StatusBarManager" );
Method showsb;
if (Build.VERSION.SDK_INT >= 17) {
showsb = statusbarManager.getMethod("expandNotificationsPanel");
}
else {
showsb = statusbarManager.getMethod("expand");
}
showsb.invoke( sbservice );
Y el permiso apropiado se debe agregar a AndroidManifest
.
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
Obviamente, esto no es parte de la API publicada, por lo que no se garantiza que funcione en el futuro y muchas personas recomendarían no hacerlo.
Lamentablemente, todavía no hay una API oficial (solicitada here ), pero por ahora, puedes usar este código, que he generalizado de todas las respuestas que he encontrado:
// https://gist.github.com/XinyueZ/7bad2c02be425b350b7f requires permission: "android.permission.EXPAND_STATUS_BAR"
@SuppressLint("WrongConstant", "PrivateApi")
fun setExpandNotificationDrawer(context: Context, expand: Boolean) {
try {
val statusBarService = context.getSystemService("statusbar")
val methodName =
if (expand)
if (Build.VERSION.SDK_INT >= 17) "expandNotificationsPanel" else "expand"
else
if (Build.VERSION.SDK_INT >= 17) "collapsePanels" else "collapse"
val statusBarManager: Class<*> = Class.forName("android.app.StatusBarManager")
val method: Method = statusBarManager.getMethod(methodName)
method.invoke(statusBarService)
} catch (e: Exception) {
e.printStackTrace()
}
}
Puede cerrar el cajón de notificaciones mediante programación transmitiendo una intención ACTION_CLOSE_SYSTEM_DIALOGS
.
Esto hace que los "diálogos del sistema temporal" sean descartados. De la documentación:
Algunos ejemplos de diálogos temporales del sistema son el sombreado de la ventana de notificación y el diálogo de tareas recientes.
Esto no requiere ningún permiso, y aparentemente ha estado disponible desde Android 1.0.
El siguiente código me funciona en un Nexus 4 con Android 5.0:
Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);
Sí, puedes agregar este código a donde quieras que se ejecute
Object sbservice = getSystemService( "statusbar" );
Class<?> statusbarManager = Class.forName( "android.app.StatusBarManager" );
Method showsb = statusbarManager.getMethod( "expand" );
showsb.invoke( sbservice );
Y añade este permiso.
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />