一些应用程序如何阻止/替换提醒通知



背景

自从安卓系统上出现提醒通知以来,一些人喜欢它的快速处理,但也有人讨厌它出现在应用程序(尤其是游戏(的顶部。

为了显示提醒通知,开发人员可以使用类似的东西:

    final NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            .setContentTitle("aa").setContentText("bb").setTicker("cc")
            .setColor(0xffff0000).setSmallIcon(R.mipmap.ic_launcher)
            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
            .setPriority(Notification.PRIORITY_HIGH);
    if (Build.VERSION.SDK_INT >= 21)
        builder.setVibrate(new long[0]);
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(1, builder.build());

正因为如此,一些应用程序想出了显示以某种方式取代它们的股票代码文本通知的想法,就像在提醒通知之前一样:

https://play.google.com/store/apps/details?id=com.jamworks.noheadsup&hl=en-

在各种情况下,这可能是有用的。例如,在使用全屏的游戏中,它可能很有用。这是因为,如果用户即将按下顶部区域,并且会显示抬头通知,我们希望避免意外点击此通知。

问题

我不仅找不到人们是如何做到这一点的,而且它似乎不再适用于新版本的安卓系统(在安卓7上测试(。

我发现的唯一一个阻止通知的应用程序是:https://play.google.com/store/apps/details?id=com.aboutmycode.NotificationsOff&hl=en-

然而,它并没有将提醒通知转换为"正常"通知。相反,它只是将它们全部屏蔽。此外,它需要root用户,并且似乎只是将通知的设置更改为"阻止"。

问题

是否可以暂时阻止提醒通知(然后将其转换为没有提醒通知的通知(?如果是,如何?

它有哪些限制?它能在没有根的情况下工作吗?如果根是可能的,怎么做?"NotificationsOff"是如何工作的?

也许这种能力以前是可能的,但现在不行了?

在Android 18+上有一个NotificationListenerService。当显示新通知时,此服务会收到通知。然后,我明白有三种行动方式:

  • 拦截通知,使其不会显示(不完全确定是否可以这样做(选中:如果NotificationListenerService在接收通知时没有调用super.xxx,则也会显示通知。因此,这种方法似乎不起作用
  • 在发布通知时清除通知。为此,您可以使用NotificationManager清除给定的通知或clearAllNotifications选中:它可以部分清除通知,但您仍然可以看到通知显示,然后它不在通知区域中(这是一种奇怪的效果(
  • 在API 21+棒棒糖中,似乎可以覆盖NotificationListenerService#getCurrentInterruptionFilter()。此方法可以返回NotificationListenerService#INTERRUPTION_FILTER_NONE(或任何其他常量((尚未测试,应进行验证(选中:NotificationListenerService#getCurrentInterruptionFilter()是最终值,因此不能覆盖它
  • 在API 23+中,您可以使用NotificationManager#setNotificationPolicy((和NotificationManager#SetInterruption Filter(((按特定顺序(来控制向用户显示哪些通知。这些API需要权限注意,这些方法似乎是访问功能的一种方便,但跳过了实现完整的NotificationListenerService这是唯一能以令人满意的方式工作的选项

关于NotificationListenerService,您可以在GitHub kpbird/NotificationListenerServiceExample和本文中看到以下示例。

关于NotificationManager,请参阅StackOverflow中这篇文章中的其他信息(特别有趣的是突出显示的注释(和这篇文章。

示例、测试和附加说明

我已经将以下存储库上传到GitHub,并附上一个基于kpbird的示例,以测试所有假设并提供最终结论。

请注意,为了使应用程序正常运行,必须执行以下步骤以启用应用程序访问通知的权限。此答案还提供了打开正确部分中的系统设置的方法。

此外,为了完整性,以下答案提供了一种检查权限是否已授予的方法。

附加说明:很明显,第一个版本的棉花糖有一个错误,NotificationManager#setInterruptionFilter()不起作用。看看这里和这里。

最新更新