我到处搜索,但在SDK或Google上找不到任何关于如何执行此操作的内容。我知道这是可能的,因为所有自定义发射器都可以通过按钮按下(LauncherPro,ADW等)来完成。
感谢。
答案 0 :(得分:33)
您可以通过广播ACTION_CLOSE_SYSTEM_DIALOGS
意图以编程方式关闭通知抽屉。
这会导致"临时系统对话框"被解雇来自文档:
临时系统对话框的一些示例是通知窗口阴影和最近的任务对话框。
这并不需要任何权限,并且自Android 1.0以来显然已经可用。
以下代码适用于运行Android 5.0的Nexus 4:
Intent closeIntent = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(closeIntent);
答案 1 :(得分:19)
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的一部分,因此不保证将来可以使用,很多人会建议不要这样做。
答案 2 :(得分:14)
是的,您可以将此代码添加到您希望执行的任何位置
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" />
答案 3 :(得分:4)
如何以编程方式在Android中打开/关闭通知?
使用Android SDK无法完成您想要的任务。
我知道这是可能的,因为所有苛刻的发射器都可以通过按钮按下(LauncherPro,ADW等)来完成。
所有“自定义发射器”都绕过SDK,使用@Yoni Samlan在您的问题的另一个答案中提出的技术变体。设备制造商可以删除不属于SDK的内容,在未来版本中由核心Android团队取代等。
我认为你想要的应该可以通过SDK;否则,它确实限制了替代的主屏幕实现。但是,你和我想要的并不是那么重要。
答案 4 :(得分:0)
遗憾的是,仍然没有正式的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()
}
}
答案 5 :(得分:0)
Christopher Orr's answer works great for closing the notification drawer。
您可以使用AccessibilityServices通过以下方式以编程方式显示通知或快速设置:
答案 6 :(得分:-2)
以下是Android Launcher
的showNotifications方法:
private void showNotifications() {
final StatusBarManager statusBar = (StatusBarManager) getSystemService(STATUS_BAR_SERVICE);
if (statusBar != null) {
statusBar.expand();
}
}
(正如Robby指出的那样,是“状态栏”系统服务)。