Я искал везде, но не могу найти ничего в SDK или в Google о том, как это сделать. Я знаю, что это возможно, потому что все пользовательские программы запуска могут сделать это нажатием кнопки (LauncherPro, ADW и т. д.).
Спасибо.
Я искал везде, но не могу найти ничего в SDK или в Google о том, как это сделать. Я знаю, что это возможно, потому что все пользовательские программы запуска могут сделать это нажатием кнопки (LauncherPro, ADW и т. д.).
Спасибо.
Вы можете программно закрыть панель уведомлений, передав ACTION_CLOSE_SYSTEM_DIALOGS
намерение.
Это приводит к тому, что «временные системные диалоги» закрываются. Из документации:
Некоторыми примерами временных системных диалогов являются шторка окна уведомлений и диалог недавних задач.
Это не требует никаких разрешений и, по-видимому, доступно с Android 1.0.
Следующий код работает для меня на Nexus 4 под управлением Android 5.0:
Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);
adb
: adb shell am broadcast -a android.intent.action.CLOSE_SYSTEM_DIALOGS
- person jonleighton; 14.11.2018
ответ от Ashwin работает для версий Android ниже 4.2.2 (т.е. ниже версии 17). В версии 4.2.2 метод «расширить» был изменен на «расширить панель уведомлений». Если вы не используете это имя метода для 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, поэтому не гарантируется, что это будет работать в будущем, и многие люди не советуют этого делать.
Да, вы можете добавить этот код туда, где хотите, чтобы он выполнялся.
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" />
Как я могу программно открывать/закрывать уведомления в Android?
То, что вы хотите, невозможно сделать с помощью Android SDK.
Я знаю, что это возможно, потому что все пользовательские программы запуска могут сделать это нажатием кнопки (LauncherPro, ADW и т. д.).
Все «пользовательские пусковые установки» обходят SDK, используя вариант метода, предложенного @Yoni Samlan в другом ответе на ваш вопрос. Вещи, которые не являются частью SDK, могут быть удалены производителями устройств, заменены основной командой Android в будущих выпусках и т. д.
Я бы сказал, что то, что вы хотите, должно быть возможным через SDK; в противном случае это действительно ограничивает альтернативные реализации домашнего экрана. Однако то, чего мы с тобой хотим, не имеет большого значения.
К сожалению, до сих пор нет официального 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()
}
}
Ответ Кристофера Орра отлично подходит для закрытия панели уведомлений.
Вы можете использовать AccessibilityServices для программного отображения уведомлений или быстрых настроек, вызвав:
Вот метод showNotifications из Android Launcher
:
private void showNotifications() {
final StatusBarManager statusBar = (StatusBarManager) getSystemService(STATUS_BAR_SERVICE);
if (statusBar != null) {
statusBar.expand();
}
}
(которая, как указал Робби, является системной службой «строки состояния»).