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

如何在Android中以编程方式打开/关闭通知?,android,android-notification-bar,Android,Android Notification Bar,我到处都搜索过,但在SDK或谷歌上找不到任何关于如何做到这一点的信息。我知道这是可能的,因为所有的定制启动器都可以通过按下按钮(LauncherPro、ADW等)来实现 谢谢。这是Android的启动器中的showNotifications方法: private void showNotifications() { final StatusBarManager statusBar = (StatusBarManager) getSystemService(STATUS_BAR_SERVI

我到处都搜索过,但在SDK或谷歌上找不到任何关于如何做到这一点的信息。我知道这是可能的,因为所有的定制启动器都可以通过按下按钮(LauncherPro、ADW等)来实现


谢谢。

这是Android的
启动器中的showNotifications方法

private void showNotifications() {
    final StatusBarManager statusBar = (StatusBarManager) getSystemService(STATUS_BAR_SERVICE);
    if (statusBar != null) {
        statusBar.expand();
    }
}
(正如Robby所指出的,它是“statusbar”系统服务)

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

使用Android SDK无法完成您想要的操作

我知道这是可能的,因为所有cuustome启动器都可以通过按下按钮(LauncherPro、ADW等)来完成

所有的“定制启动器”都绕过了SDK,使用了@Yoni Samlan在对您问题的另一个回答中提出的技术变体。不属于SDK的东西可以由设备制造商移除,在未来的版本中由核心Android团队替换,等等


我认为你想要的东西应该可以通过SDK实现;否则,它实际上限制了其他主屏幕实现。但是,您和我想要的并不重要。

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

Object sbservice = getSystemService( "statusbar" );
Class<?> statusbarManager = Class.forName( "android.app.StatusBarManager" );
Method showsb = statusbarManager.getMethod( "expand" );
showsb.invoke( sbservice );
Object sbservice=getSystemService(“statusbar”);
Class statusbarManager=Class.forName(“android.app.statusbarManager”);
方法showsb=statusbarManager.getMethod(“展开”);
showsb.invoke(sbservice);
并添加此权限

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

适用于低于4.2.2(即低于版本17)的Android版本。在4.2.2中,“扩展”方法更改为“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 );
显然,这不是已发布API的一部分,因此这不能保证在将来工作,许多人会建议不要这样做。

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

这会导致“临时系统对话框”被取消。从文件中:

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

这不需要任何权限,显然从Android 1.0开始就可以使用

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

Intent closeIntent=新意图(Intent.ACTION\u CLOSE\u SYSTEM\u对话框);
发送广播(closeIntent);

遗憾的是,目前还没有官方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()
    }
}
//基于https://gist.github.com/XinyueZ/7bad2c02be425b350b7f 
//需要权限:“android.permission.EXPAND\u STATUS\u BAR”
@SuppressLint(“错误常量”、“私有API”)
fun setExpandNotificationDrawer(上下文:上下文,扩展:布尔值){
试一试{
val statusBarService=context.getSystemService(“statusbar”)
val方法名=
如果(展开)
如果(Build.VERSION.SDK_INT>=17)“expandNotificationsPanel”或“expand”
其他的
如果(Build.VERSION.SDK_INT>=17)“collapsePanels”或“collapse”
val statusBarManager:Class=Class.forName(“android.app.statusBarManager”)
val方法:方法=statusBarManager.getMethod(方法名)
调用(statusBarService)
}捕获(e:例外){
e、 printStackTrace()
}
}

通过调用以下命令,可以使用以编程方式显示通知或快速设置:



getSystemService(“状态栏”)是否返回对象?是的。但我无法将其映射到StatusBarManager,因为它不是公共API的一部分。所以,现在我把它作为类型“Object”。我可以对它做些什么使其可用?这不是Android SDK的一部分。这不起作用,因为公共APIYup中没有StatusBarManager类。公共软件是正确的;对不起,我只是浏览了一下源代码,而不是相关的SDK。这可能已经过时了,但Fede的UberMusic就是这么做的!实际上,有两个权限状态栏和扩展状态栏可能会有用。好的,有没有“黑客”方法让通知关闭?例如,在启动意图时,是否可以设置任何标志来强制关闭通知栏?或者其他类似的东西?@user496854:我不知道。@com,仍然没有办法做到这一点吗?@whoabackoff:Android SDK中仍然没有这方面的内容。哦,在4.2.2版中,您也可以使用“expandSettingsPanel”方法要直接显示新的设置面板,以及从4.2.2版开始提供的切换。我获得InvocationTargetException,我还必须向测试项目添加权限,我必须在Android 4.3上调用CollapsePanel。以下是源代码:这似乎不适用于使用棒棒糖或更高版本的三星设备。我错了吗?这对我有帮助。谢谢。这应该是公认的答案。接受答案中的解决方案对我不起作用。通过
adb
adb shell am broadcast-a android.intent.action.CLOSE_SYSTEM_DIALOGS
打开通知抽屉怎么样?有没有办法加快转换?
// 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()
    }
}