我到处搜索,但在 SDK 或 Google 上找不到任何关于如何执行此操作的内容。我知道这是可能的,因为所有自定义启动器都可以通过按下按钮(LauncherPro、ADW 等)来完成。
谢谢。
我到处搜索,但在 SDK 或 Google 上找不到任何关于如何执行此操作的内容。我知道这是可能的,因为所有自定义启动器都可以通过按下按钮(LauncherPro、ADW 等)来完成。
谢谢。
您可以通过广播意图以编程方式关闭通知抽屉。ACTION_CLOSE_SYSTEM_DIALOGS
这会导致“临时系统对话框”被解除。从文档中:
临时系统对话框的一些示例是通知窗口阴影和最近的任务对话框。
这不需要任何权限,并且显然自 Android 1.0 起就可用。
以下代码适用于我在运行 Android 5.0 的 Nexus 4 上:
Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);
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 的一部分,因此不能保证将来可以使用,许多人会建议不要这样做。
是的,您可以将此代码添加到您希望它执行的任何位置
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 实现;否则,它确实限制了替代主屏幕的实现。然而,你和我想要的并不重要。
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()
}
}
Christopher Orr 的回答非常适合关闭通知抽屉。
您可以使用AccessibilityServices通过调用以编程方式显示通知或快速设置:
这是来自 Android 的 showNotifications 方法Launcher
:
private void showNotifications() {
final StatusBarManager statusBar = (StatusBarManager) getSystemService(STATUS_BAR_SERVICE);
if (statusBar != null) {
statusBar.expand();
}
}
(正如 Robby 所指出的,它是“statusbar”系统服务)。