8

背景

自从 Android 上出现提示通知以来,有些人喜欢它的快速处理,但有些人讨厌它显示在应用程序(尤其是游戏)之上。

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

    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

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

问题

我不仅找不到人们如何做到这一点的方法,而且它似乎不再适用于新版本的 Android(在 Android 7 上测试)。

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

但它不会将提醒通知转换为“正常”通知。相反,它只是阻止了它们。另外它需要root,并且似乎只是将通知的设置更改为 "blocked" 。

问题

是否可以暂时阻止提醒通知(但将它们转换为没有提醒通知的通知)?如果是这样,怎么做?

它有哪些限制?没有root能用吗?如果可以使用root,如何?“通知关闭”如何工作?

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

4

1 回答 1

8

在 Android 18+ 上有一个NotificationListenerService。当显示新通知时,此服务会收到通知。然后,我知道有三种方法可以采取行动:

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

关于 NotificationListenerService,您可以在GitHub kpbird/NotificationListenerService-Example和这篇文章中看到以下示例。

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

示例、测试和附加说明

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

请注意,必须按照以下步骤启用应用程序访问通知的权限,以便应用程序正常运行。这个答案还提供了一种在正确部分打开系统设置的方法。

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

附加说明:显然 Marshmallow 的第一个版本有一个NotificationManager#setInterruptionFilter()无法正常工作的错误。见这里这里

于 2016-10-11T20:10:45.503 回答