32

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

谢谢。

4

7 回答 7

48

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

这会导致“临时系统对话框”被解除。从文档中:

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

这不需要任何权限,并且显然自 Android 1.0 起就可用。

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

Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);
于 2015-07-30T23:51:50.613 回答
25

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 的一部分,因此不能保证将来可以使用,许多人会建议不要这样做。

于 2013-03-23T01:50:31.410 回答
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" />
于 2012-07-04T06:18:13.970 回答
4

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

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

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

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

我认为你想要的应该可以通过 SDK 实现;否则,它确实限制了替代主屏幕的实现。然而,你和我想要的并不重要。

于 2011-02-17T14:28:20.913 回答
4

Sadly there's still no official API (requested here), but for now, you can use this code, which I've generalized from all of the answers I've found :

// 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()
    }
}
于 2018-07-02T08:43:04.763 回答
2

Christopher Orr 的回答非常适合关闭通知抽屉

您可以使用AccessibilityServices通过调用以编程方式显示通知或快速设置:

于 2018-11-17T03:38:34.207 回答
-3

这是来自 Android 的 showNotifications 方法Launcher

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

(正如 Robby 所指出的,它是“statusbar”系统服务)。

于 2011-02-17T14:13:16.697 回答