【问题标题】:How to dismiss notification since Android 12?自 Android 12 以来如何关闭通知?
【发布时间】:2022-06-10 20:16:10
【问题描述】:

我的应用会创建一个通知,其中包含用户可以选择的两个操作。 选择任一操作后,我希望自动关闭通知。到目前为止,我通过在我的 BroadcastReceiveronReceive 结束时实现了这一点:

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 做到了!毕竟我只需要cancelAll。谢谢!
  • 问题是你的通知什么时候需要粘性

标签: java android android-notifications


【解决方案1】:

根据安卓官方网站。

developer link

如果您的应用面向 Android 12,则在这种情况下您无需使用 ACTION_CLOSE_SYSTEM_DIALOGS。这是因为,如果您的应用在窗口位于通知抽屉顶部时调用 startActivity(),系统会自动关闭通知抽屉。

【讨论】:

    【解决方案2】:

    ACTION_CLOSE_SYSTEM_DIALOGS 用于系统和预装应用。需要签名许可。

    AccessibilityService.GLOBAL_ACTION_DISMISS_NOTIFICATION_SHADE 太过分了。就像“把你家的钥匙给我,我可以清理你学校旁边的垃圾”

    StatusBarManager collapsePanels() 是隐藏的 API。您必须使用双重反射才能使用它(AndroidStudio 足够聪明,可以通过简单反射查看)。对我不起作用。抛出异常,但是被反射隐藏了。

    对不起,我不能给你解决方案,但至少我给了你地方,我搜索并失败了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      相关资源
      最近更新 更多