2011-02-17 26 views
24

He buscado en todas partes, pero no puedo encontrar nada en el SDK o en Google sobre cómo hacerlo. Sé que es posible porque todos los iniciadores personalizados pueden hacerlo presionando un botón (LauncherPro, ADW, etc.).¿Cómo puedo abrir/cerrar programáticamente las notificaciones en Android?

Gracias.

+0

¿El getSystemService ("barra de estado") devolver un objeto? –

+0

sí lo hace. Pero no puedo asignarlo a StatusBarManager porque no forma parte de la API pública. Entonces, ahora mismo lo tengo como tipo "Objeto". ¿Qué puedo hacer para que sea utilizable? – user496854

Respuesta

17

Los answer from Ashwin obras para las versiones de Android 4.2.2 (es decir, por debajo de debajo de la versión 17) En 4.2.2, el método "expandir" se cambió a "expandNotificationsPanel". Si no utiliza ese nombre de método para 4.2.2 y superior, obtendrá una excepción de puntero nulo. Por lo que el código debe 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 apropiado permiso debe añadirse 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 mucha gente le aconsejaría en contra de hacer esto.

+1

Ah, y también en la versión 4.2.2, puede usar el método "expandSettingsPanel" para mostrar directamente el nuevo panel de configuraciones con los conmutadores que estaban disponibles a partir de la versión 4.2.2. – Jonathan

+0

Obtengo InvocationTargetException –

+0

Tuve que agregar el permiso para el proyecto de prueba también –

-1

Aquí está el método showNotifications desde Android de Launcher:

private void showNotifications() { 
    final StatusBarManager statusBar = (StatusBarManager) getSystemService(STATUS_BAR_SERVICE); 
    if (statusBar != null) { 
     statusBar.expand(); 
    } 
} 

(que, como se indica Robby, es el servicio del sistema "barra de estado").

+0

Esto no forma parte del SDK de Android. – CommonsWare

+2

esto no funciona porque no hay clase StatusBarManager en la API pública – user496854

+0

Sí. CommonsWare tiene razón; Solo estaba hurgando en el código fuente y no en los SDK relacionados, lo siento. –

4

¿Cómo puedo abrir/cerrar las notificaciones mediante programación en Android?

Lo que desea no se puede hacer con el SDK de Android.

Sé que es posible porque todos los iniciadores de cuustome son capaces de hacerlo presionando un botón (LauncherPro, ADW, etc.).

Todos los "iniciadores personalizados" están pasando por alto el SDK, utilizando una variación de la técnica que @Yoni Samlan propuso en otra respuesta a su pregunta. Las cosas que no forman parte del SDK pueden ser eliminadas por los fabricantes del dispositivo, reemplazadas por el equipo principal de Android en futuras versiones, etc.

Yo diría que lo que usted desea debería ser a través del SDK; de lo contrario, realmente limita las implementaciones alternativas de la pantalla de inicio. Sin embargo, lo que tú y yo queremos no cuenta por mucho.

+0

OK, ¿hay alguna forma "hacky" de cerrar las notificaciones? Por ejemplo, ¿hay algún indicador que pueda establecer al lanzar un intento que obligue a cerrar la barra de notificaciones? ¿O algo así? – user496854

+0

@ user496854: No que yo sepa. – CommonsWare

+0

@com, ¿todavía no hay forma de hacer esto? – whoabackoff

14

Sí se puede añadir este código a donde quiera que se ejecute

Object sbservice = getSystemService("statusbar"); 
Class<?> statusbarManager = Class.forName("android.app.StatusBarManager"); 
Method showsb = statusbarManager.getMethod("expand"); 
showsb.invoke(sbservice); 

y añadir el permiso

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" /> 
+0

¿Hay alguna manera de hacer la transición más rápido? – vault

21

Puede programáticamente cerrar el cajón de notificaciones mediante la transmisión de un intento ACTION_CLOSE_SYSTEM_DIALOGS.

Esto provoca el cierre de los "cuadros de diálogo temporales del sistema". De la documentación:

Algunos ejemplos de diálogos temporales del sistema son el cuadro de diálogo de notificaciones de las ventanas y las tareas recientes.

Esto no requiere ningún permiso, y aparentemente ha estado disponible desde Android 1.0.

El siguiente código funciona para mí en un Nexus 4 con Android 5.0:

Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); 
context.sendBroadcast(closeIntent); 
+2

Esto me ha ayudado. Gracias. – Andrey

+0

Genius! Funciona bien en Android 5.1. ¡Muchas gracias! –

Cuestiones relacionadas