Android 12 如何取消通知?

12
我的应用程序创建了一个通知,其中包含两个用户可以选择的操作。在选择其中任何一个操作后,我希望通知自动消失。到目前为止,我通过在我的BroadcastReceiver的onReceive的结尾处添加以下代码来实现这一功能:
Intent it = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(it);
NotificationManagerCompat.from(context.getApplicationContext()).cancelAll();

在升级到Android 12后,通知不再被关闭。相反,出现以下错误:

java.lang.SecurityException: Permission Denial:android.intent.action.CLOSE_SYSTEM_DIALOGS 广播来自 (…) 需要 android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS 权限。原因:android.os.RemoteException

尽管添加了该权限也没有效果。通过搜索我发现,ACTION_CLOSE_SYSTEM_DIALOGS 已被弃用,唯一的官方替代方案似乎是 AccessibilityService,但我没有找到任何示例。所以我的问题是:现在关闭通知的最佳方法是什么?如果确实是通过 AccessibilityService,那么该如何操作呢?

编辑:现在我意识到我在原始代码中做了两件不同的事情:关闭通知面板和解除通知。最后一个部分(cancelAll)已经满足了我的需求,而且它还可以在没有其他应用程序的通知时关闭面板。但是需要注意的是,当仍有另一个通知在托盘中时,仍然无法像 ACTION_CLOSE_SYSTEM_DIALOGS 那样关闭面板。


摆脱ACTION_CLOSE_SYSTEM_DIALOGS,只需在NotificationManagerNotificationManagerCompat上使用cancel()cancelAll() - CommonsWare
@CommonsWare 就是这样做的!我最终只需要 cancelAll。谢谢! - Leandro 86
问题在于当你的通知需要是粘性的时候。 - Talu
一个跟踪可能是在清单中添加新的权限<uses-permission android:name="android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS" />,但仅此并不解决问题。 - Tobias Reich
你现在知道答案了吗? - Muhammad Asad
2个回答

5

ACTION_CLOSE_SYSTEM_DIALOGS 用于系统和预安装应用程序。需要签名权限。

AccessibilityService.GLOBAL_ACTION_DISMISS_NOTIFICATION_SHADE 这个方法有点大材小用了。就像是,“把家里的钥匙给我,这样我可以帮你清理学校门口的垃圾。”

StatusBarManager collapsePanels() 是一个隐藏的API。你需要使用双重反射来使用它(AndroidStudio 足够聪明,可以看出简单反射)。对我来说没有起作用。它会抛出一个异常,但被反射隐藏了。

很抱歉我无法给您提供解决方案,但至少我给出了我搜寻失败的地方。


1
根据安卓官方网站。 开发者链接 如果您的应用程序针对Android 12,则在此情况下无需使用ACTION_CLOSE_SYSTEM_DIALOGS。这是因为,如果您的应用程序在通知抽屉顶部有一个窗口时调用startActivity(),系统会自动关闭通知抽屉。

这意味着我们无法在12+设备上隐藏状态栏吗? - Arul
1
我发现状态栏管理器中找不到statusBarManager!!.getMethod("collapsePanels"),有人能告诉我其他的替代方法吗? - Arul
1
这对我来说根本不起作用。Pending Intent被执行,活动已启动,但通知栏仍然可见。 - David Gölzhäuser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接