web-dev-qa-db-fra.com

Comment puis-je ouvrir/fermer par programmation des notifications dans Android?

J'ai cherché partout, mais je ne trouve rien dans le SDK ou sur Google qui explique comment faire cela. Je sais que c'est possible parce que tous les lanceurs personnalisés peuvent le faire via une pression sur un bouton (LauncherPro, ADW, etc.).

Merci.

27
user496854

Vous pouvez par programme fermer le tiroir de notification en diffusant un ACTION_CLOSE_SYSTEM_DIALOGS intent.

Cela provoque la fermeture des "dialogues système temporaires". De la documentation:

Quelques exemples de boîtes de dialogue système temporaires sont l’icône de fenêtre de notification et la boîte de dialogue des tâches récentes.

Cela ne nécessite aucune autorisation et est apparemment disponible depuis Android 1.0.

Le code suivant fonctionne pour moi sur un Nexus 4 sous Android 5.0:

Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);
32
Christopher Orr

La réponse de Ashwin fonctionne pour les versions Android inférieures à 4.2.2 (c'est-à-dire inférieures à la version 17). En 4.2.2, la méthode "expand" a été remplacée par "expandNotificationsPanel". Si vous n'utilisez pas ce nom de méthode pour les versions 4.2.2 et supérieures, vous obtiendrez une exception de pointeur nul. Donc, le code devrait être:

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

Et la permission appropriée devrait être ajoutée à AndroidManifest.

<uses-permission Android:name="Android.permission.EXPAND_STATUS_BAR" />

De toute évidence, cela ne fait pas partie de l'API publiée. Il n'est donc pas garanti que cela fonctionne à l'avenir et de nombreuses personnes déconseillent de le faire.

19
Jonathan

Oui, vous pouvez ajouter ce code à l'endroit où vous voulez qu'il soit exécuté

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

Et ajoutez cette permission

<uses-permission Android:name="Android.permission.EXPAND_STATUS_BAR" />
14
Ashwin Singh

Comment puis-je ouvrir/fermer par programmation des notifications dans Android?

Ce que vous voulez ne peut pas être fait avec le SDK Android.

Je sais que c'est possible parce que tous les lanceurs sont capables de le faire via une pression sur un bouton (LauncherPro, ADW, etc.).

Tous les "lanceurs personnalisés" contournent le SDK, en utilisant une variante de la technique proposée par @Yoni Samlan dans une autre réponse à votre question. Les éléments qui ne font pas partie du SDK peuvent être supprimés par les fabricants d’appareils, remplacés par l’équipe Android principale dans les versions ultérieures, etc.

Je dirais que ce que vous voulez devrait être possible via le SDK; sinon, cela limite vraiment les implémentations alternatives de l'écran d'accueil. Cependant, ce que vous et moi voulons ne compte pas beaucoup.

4
CommonsWare
0
Eric

Malheureusement, il n'y a toujours pas d'API officielle (demandé ici ), mais pour l'instant, vous pouvez utiliser ce code, que j'ai généralisé à partir de toutes les réponses que j'ai trouvées:

//    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()
    }
}
0
android developer