某些应用如何阻止/替换抬头通知? [英] How do some apps block/replace heads-up notifications?

查看:67
本文介绍了某些应用如何阻止/替换抬头通知?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

自从抬头通知出现在Android上以来,有些人就喜欢它的快速处理功能,但有些人讨厌它显示在应用程序(尤其是游戏)的顶部.

Ever since heads-up notifications appeared on Android, some people liked it for its quick handling, yet some hated it for showing on top of apps (especially games).

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

In order to show heads-up notifications, developers can use something like that:

    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());

因此,一些应用提出了一种想法,即显示报价文本通知以某种方式替换它们,就像以前在抬头通知之前一样:

Because of this, some apps came up with the idea to show ticker-text notifications that replace them somehow, just as it used to be before heads-up notifications:

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

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

There are various scenarios where this could be useful. It could be, for example, useful in case of games, where full screen is used. That's because if the user is about to press the top area, and the heads-up notifications are shown, we would like to avoid accidental click on this notification.

不仅我找不到人们做事的方式,而且似乎在新版本的Android(已在Android 7上测试)上也不再起作用.

Not only I can't find a way of how people did it, but it seems it doesn't work anymore on new versions of Android (tested on Android 7).

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

The only app I've found that blocks notification is this: https://play.google.com/store/apps/details?id=com.aboutmycode.NotificationsOff&hl=en

但是,它不会将平视通知转换为正常"通知.相反,它只是阻止了所有这些.另外,它需要root用户,并且似乎只是将通知的设置更改为"blocked".

yet it doesn't convert the heads-up notifications to "normal" ones. Instead, it just blocks them all. Plus it requires root, and seems to just change the settings of the notifications to "blocked" .

是否可以暂时阻止抬头通知(并将其转换为没有抬头通知的通知)?如果是这样,怎么办?

Is it possible to temporarily block the heads up notifications (and yet convert them to ones without heads-up notifications ) ? If so, how?

它有哪些限制?没有root可以工作吗?如果可以用root,怎么办?"NotificationsOff"如何工作?

Which restrictions does it have? Can it work without root? If it's possible with root, how? How does the "NotificationsOff" work?

也许以前有这种能力,但是现在没有?

Maybe this ability was possible before, but now it is not?

推荐答案

在Android 18+上,有一个

On Android 18+ there is a NotificationListenerService. This service gets notified when new notifications are shown. Then, I understand there are three ways to act:

  • Intercepting the notifications so they don't get displayed (not completely sure this can be done) Checked: if the NotificationListenerService doesn't call super.xxx when receiving a notification, the notification is also showed. So this method seems to not work.
  • Clearing notifications as they get posted. For this, you can use NotificationManager to either clear a given notification or clearAllNotifications Checked: it partially works to clear the notifications, but you still see the notification showing up and then it's not in the notification area (it's weird effect).
  • In API 21+ Lollipop it seems that you can override NotificationListenerService#getCurrentInterruptionFilter(). This method could return NotificationListenerService#INTERRUPTION_FILTER_NONE (or any other of the constants), (haven't tested, should be verified). Checked: NotificationListenerService#getCurrentInterruptionFilter() is final, so it cannot be overridden.
  • In API 23+ you can use both NotificationManager#setNotificationPolicy() and NotificationManager#setInterruptionFilter() (in that specific order) to control which notifications are shown to the user. Permissions are required for those APIs. Notice that this methods seem to be a convenience to be able to access the functionality, but skip implementing a complete NotificationListenerService. That's the only option that can work in a satisfying way

关于NotificationListenerService,您可以在 GitHub kpbird/NotificationListenerService-Example 和以下示例中看到以下示例此帖子.

About NotificationListenerService, you can see the following samples in GitHub kpbird/NotificationListenerService-Example and in this post.

关于NotificationManager,请参阅 StackOverflow中的此帖子中的其他信息(特别有趣的是突出显示的注释),并在此

About NotificationManager, see additional information in this post in StackOverflow (specially interesting the highlighted comment) and in this post.

示例,测试和其他说明

我已将以下存储库上传到GitHub ,并以基于kpbird的示例为例进行了测试所有的假设并提供最终结论.

I've uploaded the following repository to GitHub with an example based on kpbird's, to test all the assumptions and provide final conclusions.

请注意遵循启用权限的步骤为了使应用程序能够访问通知,必须遵循该命令才能使该应用程序正常运行.该答案还提供了一种在正确部分中打开系统设置"的方法.

Notice that the following steps to enable the permission for the app to be able to access the notifications must be followed in order for the app to function properly. This answer also provides a way to open System Settings in the correct section.

出于完整性考虑,

Also, for completeness, the following answer provides a way to check whether the permission is already granted or not.

补充说明:棉花糖的第一个版本显然存在一个错误,该错误导致 NotificationManager#setInterruptionFilter()无法正常工作.请参见此处

Additional note: apparently first versions of Marshmallow have a bug where NotificationManager#setInterruptionFilter() doesn't work. See here and here.

这篇关于某些应用如何阻止/替换抬头通知?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆