如何在Android中以编程方式打开/关闭通知?
我到处都搜索过,但在SDK或谷歌上找不到任何关于如何做到这一点的信息。我知道这是可能的,因为所有的定制启动器都可以通过按下按钮(LauncherPro、ADW等)来实现如何在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
谢谢。这是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()
}
}
通过调用以下命令,可以使用以编程方式显示通知或快速设置:
(
)
(
)
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()
}
}