如何通过Android代码停止悬浮通知的发布?

3
我正在开发一款 Android 应用程序,它可以替换通知抽屉并在自己的窗口中显示通知。通过重写 onNotificationPosted() 方法,在我的抽屉上显示了通知。但是,同样的通知也会被 Android 显示。因此,我希望通知仅在我的窗口中显示,有其他应用程序已经实现了这个功能,所以这不是不可能的。请告诉我如何覆盖 Android 的默认行为。提前感谢您的帮助。
编辑:我想禁用“悬浮通知”,有什么解决方案吗?

2
是的,@VipulAsri 是正确的。Snowball可以做到这一点。实际上,中列出的所有应用程序都可以做到这一点。 - Dave Ranjan
1
很好的问题@Bonatti。我已经尝试在扩展NotificationListenerService中的onNotificationPosted中的第一件事中使用NotificationManager.cancelAll() - Dave Ranjan
编辑你的问题,给我们更多细节,发布你的清单文件(至少包括权限),发布具有 onNotificationPosted() 方法的类以及其他试图拦截系统事件的类,最后发布目标应用程序和你正在测试的 Build/OS 版本。 - Bonatti
1
@Bonatti:我需要停止 Heads Up Android 通知,我认为你问的那些问题并不需要回答这个问题。即便如此,我还是会发布我的 AndroidManifest.xml 权限。希望能对你有所帮助。 :) - Dave Ranjan
1
那不是他想要的@Bonatti :/ 即使您取消侦听器中的所有通知,它们也只会从状态栏中删除,悬浮通知将仍然存在。由于onNotificationPosted在悬浮通知显示后触发。 - Jason Hu
显示剩余4条评论
4个回答

3
安卓 Oreo 及以上的操作系统上,需要在通知渠道(Notification channel)中设置优先级(priority),如果优先级低于NotificationManager.IMPORTANCE_HIGH或类似下面这个值,则无法弹出heads up banner。
NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
                                   CHANNEL_NAME, 
                                   NotificationManager.IMPORTANCE_DEFAULT)

安卓Oreo版本之前的设备上,通知优先级本身就可以帮助系统显示/隐藏弹出式横幅。请记住,当您进行更改时,必须删除应用并重新安装才能看到更改!


这个解决方案只适用于你自己的通知。问题是如何防止其他应用程序发布的悬浮通知。 - undefined

2

我在使用NotificationManager.IMPORTANCE_DEFAULTsetPriority(NotificationCompat.PRIORITY_DEFAULT)时,它似乎可以正常工作(Oneplus 3和Note 8)。

String channelId = "ch01";
String channelName = "Status";
int importance = NotificationManager.IMPORTANCE_DEFAULT;

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
    NotificationChannel mChannel = new NotificationChannel(
            channelId, channelName, importance);
    notificationManager.createNotificationChannel(mChannel);
}

NotificationCompat.Builder nb = new NotificationCompat.Builder(this, channelId);
    nb.setSmallIcon(R.drawable.ic_logo);
    nb.setContentTitle(notificationText);
    nb.setContentText("");
    nb.setContentIntent(mainActivityPendingIntent);
    nb.setPriority(NotificationCompat.PRIORITY_DEFAULT);
    nb.setOnlyAlertOnce(true);
    nb.setOngoing(true);
    nb.setWhen(System.currentTimeMillis());

这个解决方案只适用于您自己的通知。问题是如何防止其他应用程序发布的悬浮通知。 - undefined

1

将IMPORTANCE设置为LOW和PRIORITY设置为LOW。这对我很有效。

var notificationChannel = NotificationChannel(channelId, "Call" , NotificationManager.IMPORTANCE_LOW)
            var notification = NotificationCompat.Builder(context,channelId)
                    .setContentTitle("Calling")
                    .setContentText("Call")
                    .setContentIntent(pendingIntent)
                    .setAutoCancel(true)
                    .setPriority(NotificationCompat.PRIORITY_LOW)

1
更改重要性会产生其他副作用,例如排序和默认扩展。 - Jeffrey Blattman

1

哎呀!看起来Android没有提供通过代码禁用其他应用程序的悬浮通知的方法。

这里有一个小技巧!

因此,我们需要做的是,不显示来自任何其他应用程序的悬浮通知。为了解决这个问题,我们需要明白屏幕上一次只能有一个悬浮通知。

技巧是,在侦听到任何通知被发布即在NotificationListener子类的onNotificationPosted()中发送您自己的通知。

this.mNotificationManager.notify(12321, new Notification.Builder(this)
                .setContentTitle("").setContentText("")
                .setSmallIcon(R.drawable.transparent)
                .setPriority(Notification.PRIORITY_DEFAULT)
                .setFullScreenIntent(this.mBlankIntent, true)
                .setAutoCancel(true)
                .build());

它将用几乎空白的通知替换第三方应用程序的通知。哦,哇!等等!!这看起来很丑。
当然,在用户能够看到此通知之前,我们现在需要删除此通知。
现在您已经知道了Android的包名称。您可以像这样显示取消通知。
if(packageName.equals("com.my.package")){
        mNotificationManager.cancel(12321);
        return;
    }

因此,我们所做的是在显示任何其他悬浮通知时显示自己的通知,然后将自己的通知删除。所有这些操作发生得非常迅速,用户看不到任何悬浮通知,而且为了实现这一点,我甚至不需要将通知存储在内存中。

1
你的通知是弹出后立即消失,还是根本没有弹出?或者说它们根本没有显示过? - Jason Hu
3
是的,实际上它们不会显示任何帧数,但你必须记住这只适用于使用悬浮通知的情况,否则你可能会发送自己的每个通知。还有一件事,看起来这个技巧在 Marshmallow 上行不通。如果你发现了解决方法,请告诉我。 - Dave Ranjan
1
为了我的应用程序,我只会请求Lollipop的通知访问权限,并请求Marshmallow的勿扰访问权限。 - Jason Hu
2
所以...请勿打扰模式不会禁用悬浮通知,这很烦人...我想如果可能的话,您可以编程方式关闭所有已安装应用程序的弹出窗口。然后再把它们打开。无论如何,都没有好的解决方案 :(((( - Jason Hu
2
@JasonHu:我检查了通知优先级是否为HIGH(即2),并且震动不为空。 - Dave Ranjan
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接