Как я могу программно открывать / закрывать уведомления в Android? - PullRequest
28 голосов
/ 17 февраля 2011

Я искал везде, но не могу найти ничего в SDK или в Google о том, как это сделать.Я знаю, что это возможно, потому что все пользовательские программы запуска могут сделать это нажатием кнопки (LauncherPro, ADW и т. Д.).

Спасибо.

Ответы [ 7 ]

33 голосов
/ 31 июля 2015

Вы можете программно закрыть ящик уведомлений, передав ACTION_CLOSE_SYSTEM_DIALOGS намерение.

Это приводит к отклонению «временных системных диалогов».Из документации:

Некоторыми примерами временных системных диалогов являются тень окна уведомлений и диалог недавних задач.

Это не требует каких-либо разрешений и имееточевидно, был доступен с Android 1.0.

Следующий код работает для меня на Nexus 4 под управлением Android 5.0:

Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);
20 голосов
/ 23 марта 2013

Ответ от Ashwin работает для версий Android ниже 4.2.2 (т.е. ниже версии 17). В 4.2.2 метод «развернуть» был изменен на «расширениеNotificationsPanel». Если вы не используете это имя метода для 4.2.2 и выше, вы получите исключение нулевого указателя. Поэтому код должен быть:

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

И соответствующее разрешение должно быть добавлено к AndroidManifest.

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

Очевидно, что это не является частью опубликованного API, так что это не гарантированно сработает в будущем, и многие люди не советуют это делать.

14 голосов
/ 04 июля 2012

Да, вы можете добавить этот код туда, где вы хотите, чтобы он выполнялся

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

И добавить это разрешение

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
4 голосов
/ 17 февраля 2011

Как программно открывать / закрывать уведомления в Android?

Чего вы не можете сделать с помощью Android SDK.

Я знаю, что это возможнопотому что все пусковые установки cuustome могут сделать это с помощью нажатия кнопки (LauncherPro, ADW и т. д.).

Все «пользовательские пусковые установки» обходят SDK, используя разновидность техники, которая@ Йони Самлан предложил еще один ответ на ваш вопрос.Вещи, которые не являются частью SDK, могут быть удалены производителями устройств, заменены основной командой Android в будущих выпусках и т. Д.

Я бы сказал, что то, что вы хотите , должно быть возможным черезSDK;в противном случае это действительно ограничивает альтернативные реализации домашнего экрана.Однако то, что вы и я хотим, не имеет большого значения.

0 голосов
/ 17 ноября 2018

Ответ Кристофера Орра отлично подходит для закрытия ящика уведомлений .

. Вы можете использовать AccessibilityServices , чтобы программно показывать уведомления или быстрые настройки, вызывая:

0 голосов
/ 02 июля 2018

К сожалению, до сих пор нет официального API (запрошено здесь ), но сейчас вы можете использовать этот код, который я обобщил из всех найденных ответов :

// based on 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 голосов
/ 17 февраля 2011

Вот метод showNotifications от Android Launcher:

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

(который, как указал Робби, является системной службой «строки состояния»).

...