Подтвердить что ты не робот

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

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

Спасибо.

4b9b3361

Ответ 1

Ответ от Ashwin работает для версий Android ниже 4.2.2 (т.е. ниже версии 17). В 4.2.2 метод "expand" был изменен на "expandNotificationsPanel". Если вы не используете это имя метода для 4.2.2 и выше, вы получите исключение Null Pointer. Таким образом, код должен быть:

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, поэтому в будущем это не гарантируется, и многие люди не рекомендуют это делать.

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

То, что вы хотите, не может быть выполнено с помощью Android SDK.

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

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

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

Ответ 5

Здесь метод showNotifications от Android Launcher:

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

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