如何停止通过Android代码发布抬头通知?

时间:2015-11-30 10:52:09

标签: android android-notifications

我正在构建一个Android应用程序,它取代了通知抽屉并在自己的窗口中显示通知。我设法通过覆盖onNotificationPosted()方法在我的抽屉上显示通知。但是,同样的通知也由android显示。所以,我希望只在我的窗口上显示通知,还有其他应用程序已经完成,所以这并非不可能。请告诉我如何覆盖android的默认行为。提前致谢。 :)

修改

我想要的是禁用抬头通知。那里有解决方案吗?

4 个答案:

答案 0 :(得分:1)

咦!看起来Android无法通过代码禁用其他应用的抬头通知。

这是一个小黑客!

所以,我们需要的是,不要显示来自任何其他应用的任何抬头通知。要解决这个问题,我们需要了解一下屏幕上只能有一个抬头通知。

Hack是,在您收听任何通知后立即发送您自己的通知,即在onNotificationPosted()子类的NotificationListener中。

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

它将用您几乎空白的通知替换第3个应用程序的通知。哇哇!等待!!这看起来很难看。

当然,现在我们需要在用户看到此消息之前删除此通知。

现在你知道了android的包名。你可以显示取消你的通知这样的事情。

if(packageName.equals("com.my.package")){
        mNotificationManager.cancel(12321);
        return;
    }

所以,我们正在做的是在显示任何其他抬头通知时显示我们的通知,然后删除我们自己的通知。所有这些都发生得如此之快,以至于用户没有看到任何抬头通知,为此,我甚至不需要将通知存储在内存中。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

Oreo及更高版本的操作系统中,它是在“通知”通道中,您必须将“优先级”设置为小于NotificationManager.IMPORTANCE_HIGH的任何内容,或者以下类似内容阻止抬头提示。

NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
                                   CHANNEL_NAME, 
                                   NotificationManager.IMPORTANCE_DEFAULT)

Pre-Oreo 设备上,通知优先级本身可以帮助系统显示/隐藏抬头横幅。 还请记住,进行此更改时,您必须删除该应用程序并重新安装才能看到更改!

答案 3 :(得分:0)

将“重要度”设置为“低”,将“优先级”设置为“低”。 它对我有用

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)