我的应用程序用用户可以选择的两个操作创建一个通知。在选择任何一种操作后,我希望通知被自动取消。直到现在,我才实现了这一点,在onReceive的末尾,我的BroadcastReceiver
Intent it = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
context.sendBroadcast(it);
NotificationManagerCompat.from(context.getApplicationContext()).cancelAll();
更新到Android 12之后,通知就不再关闭了。相反,我遇到了以下错误:
java.lang.SecurityException:权限拒绝: 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相同的方式保留时,仍然不可能关闭面板以供将来参考。
发布于 2022-06-10 12:16:10
ACTION_CLOSE_SYSTEM_DIALOGS
用于系统和预装应用程序。需要签名许可。
AccessibilityService.GLOBAL_ACTION_DISMISS_NOTIFICATION_SHADE太过分了。就像,“把你家的钥匙给我,这样我就可以清理你学校旁边的垃圾了。”
StatusBarManager collapsePanels()
是隐藏的API。您必须使用双重反射来使用它(AndroidStudio非常聪明,可以通过简单的反射看到)。对我不起作用。它抛出一个异常,但它是由反射隐藏的。
对不起,我不能给你一个解决办法,但至少我给了你我搜索失败的地方。
发布于 2022-05-09 09:11:13
根据android官方网站。
如果你的应用程序的目标是安卓12,你不需要在这种情况下使用ACTION_CLOSE_SYSTEM_DIALOGS。这是因为,如果应用程序在通知抽屉顶部调用startActivity(),系统会自动关闭通知抽屉。
https://stackoverflow.com/questions/70926398
复制相似问题