如何在Android中以编程方式打开/关闭通知?

问题描述 投票:28回答:7

我到处搜索,但在SDK或Google上找不到任何关于如何执行此操作的内容。我知道这是可能的,因为所有自定义发射器都可以通过按钮按下(LauncherPro,ADW等)来完成。

谢谢。

android android-notification-bar
7个回答
34
投票

您可以通过广播ACTION_CLOSE_SYSTEM_DIALOGS意图以编程方式关闭通知抽屉。

这导致“临时系统对话”被驳回。从文档:

临时系统对话框的一些示例是通知窗口阴影和最近的任务对话框。

这不需要任何权限,并且自Android 1.0以来显然已经可用。

以下代码适用于运行Android 5.0的Nexus 4:

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

21
投票

answer from Ashwin适用于低于4.2.2的Android版本(即低于版本17)。在4.2.2中,“expand”方法更改为“expandNotificationsPanel”。如果不对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的一部分,因此不保证将来可以使用,许多人会建议不要这样做。


15
投票

是的,您可以将此代码添加到您希望它执行的任何位置

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;否则,它确实限制了替代的主屏幕实现。但是,你和我想要的并不是那么重要。


1
投票

遗憾的是,仍然没有官方API(请求here),但是现在,您可以使用此代码,我已经从我找到的所有答案中概括了:

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


-2
投票

这是Android qazxsw poi中的show Notifications方法:

Launcher

(正如Robby所说,这是“状态栏”系统服务)。

© www.soinside.com 2019 - 2024. All rights reserved.