安卓悬浮通知未显示

13

我正在尝试使悬浮式通知起作用。通知已创建,但未显示在应用程序顶部。 以下是构建通知的代码:

Notification notification = new NotificationCompat.Builder(context)
                                .setSmallIcon(android.R.drawable.arrow_up_float)
                                .setContentTitle("Check running time - click!")
                                .setContentText(String.valueOf(elapsedTime))
                                .setContentIntent(pendingIntent)
                                .setDefaults(Notification.DEFAULT_ALL)
                                .setPriority(Notification.PRIORITY_HIGH)
                                .setVibrate(new long[0])
                                .build();

我正在尝试运行应用的设备是API 21。我看过很多讨论帖,但没有解决方法适用于我。


你有没有运气解决这个问题? - Rashad.Z
我已经在我的答案https://dev59.com/D5Lea4cB1Zd3GeqP3o2y#54890459中添加了整个代码。 - Asad
6个回答

23

你需要做两件事:

  1. 确保你的通知已正确配置。请参阅:https://developer.android.com/guide/topics/ui/notifiers/notifications#Heads-up

  2. 并确保手机已正确配置(我认为这是大多数人卡住的地方)。

步骤1. 配置通知。

首先,像这样注册您的通知渠道

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        String name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_HIGH; //Important for heads-up notification
        NotificationChannel channel = new NotificationChannel("1", name, importance);
        channel.setDescription(description);
        channel.setShowBadge(true);
        channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }

然后,像这样创建通知:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, "1")
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle(textTitle)
        .setContentText(textContent)
        .setDefaults(DEFAULT_SOUND | DEFAULT_VIBRATE) //Important for heads-up notification
        .setPriority(Notification.PRIORITY_MAX); //Important for heads-up notification

最后,按照通常的方式发送通知,例如:

Finally, send the notifications as you would do normally, e.g.:

Notification buildNotification = mBuilder.build();
NotificationManager mNotifyMgr = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
mNotifyMgr.notify(001, buildNotification);
步骤2. 配置手机。
我注意到我需要在我的手机上(小米Note 3)启用一些额外的设置:
以下是一些进入菜单的方式:
  1. 长按通知,从通知栏进入。
  2. 前往:设置 > 已安装应用程序 > 选择您的应用程序 > 通知
  3. 在前面一步的基础上,您可以通过使用此意图将用户部分地带到已安装的应用程序菜单来帮助他们:

startActivity(new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS));

最后,当您到达此菜单时,启用一个名为“悬浮通知”的设置(该设置的名称因设备而异)。

7
我在三星S8上遇到了这个问题(但Pixel 2上可以运行)。最后解决的方法是更改代码的顺序。需要首先创建频道,就像以上代码中一样!卸载并重新安装(以重新创建频道),然后在S8上开始工作。 - Mark
3
上面Mark的评论很关键——即我不知道要卸载并重新安装应用程序才能使通知渠道更改生效——谢谢! - gman413
1
@Mark nailed it. 如果之前使用的重要性不是NotificationManager.IMPORTANCE_HIGH,请确保重新创建通道,否则Android将无法使用相同的ID重新创建通道,除非您卸载应用程序或使用不同的ID创建新的通道。 - Juliano
嗨@Mark!! 我正在FirebaseMessagingService.class的onCreate()中创建通道,但是清单文件一直在创建自己版本的通道(“AndroidManifest.xml中设置的通知通道尚未被应用程序创建。将使用默认值。”)。所以:我应该在生命周期的哪个时刻创建此通道?清单元数据和NotificationChannel都指向相同的String channelId... - Delark
1
嗨@Delark,我在onMessageReceived中收到通知时创建了频道,这可能不是最好的想法。我的清单中没有与频道相关的内容。 - Mark
显示剩余2条评论

1


你的代码几乎没问题。我正在使用DEFAULT_VIBRATE而不是DEFAULT_ALL:

builder.setPriority(Notification.PRIORITY_HIGH);
if (Build.VERSION.SDK_INT >= 21) {
   mBuilder.setDefaults(Notification.DEFAULT_VIBRATE);
}

但是,你也可以设置。
builder.fullScreenIntent(sameAsContentPendingtIntent);

但是这个不是确定性的。我的意思是系统选择显示一个HeadsUp或者启动Intent。在大多数情况下,它会显示HeadsUp,但是由于Android版本、制造商、启动器等等原因,我不能指望它。
最后,您还需要定义正确的通知渠道。我想你已经做过了,因为如果没有的话,您就看不到任何通知 :-) 哦,可爱的Android :-) 无论如何,我想说的是,通知渠道也需要处于高优先级:
channel = new NotificationChannel("uniqueId", "name", NotificationManager.IMPORTANCE_HIGH);
channel.enableVibration(true);

而且,我建议您在developer.android.com上查看最新的意见。
从现在起,谷歌将会更加严格。不仅针对通知,还包括'targetApi',但这是另一回事,请原谅 :-)
祝你今天有愉快的编程体验。


1

以上提供的答案是正确的,但现在只有部分正确。

对于未来的读者,请注意:

    .setDefaults(Notification.DEFAULT_ALL)
    .setPriority(Notification.PRIORITY_HIGH)

这并不能解决问题。

根据“Android开发者指南”,https://developer.android.com/guide/topics/ui/notifiers/notifications.html#Heads-up

可能会触发悬浮通知的示例条件包括以下内容:

  • 用户的活动处于全屏模式(应用使用fullScreenIntent)。
  • 通知具有高优先级并在运行Android 7.1(API级别25)及更低版本的设备上使用铃声或震动。
  • 通知渠道对于运行Android 8.0(API级别26)及更高版本的设备非常重要。

请注意,第二种解决方法(在此问题下大多数情况下被提到)仅适用于Android 7.1或更低版本。

对于Android 8.0及更高版本,您应创建一个通知渠道,其重要性为NotificationManager.IMPORTANCE_HIGH

一些示例代码:

    NotificationChannel channel =
        new NotificationChannel(
        "MY_OWN_CHANNEL_ID",
        "MY_OWN_CHANNEL_NAME",
        NotificationManager.IMPORTANCE_HIGH);

然后,请确保您的通知构建器使用此通道显示

    NotificationCompat.Builder notificationBuilder =
        new NotificationCompat.Builder(context)
            .setSmallIcon(smallIcon)
            .setContentTitle("Title")
            .setContentText("Content")
            .setChannelId("MY_OWN_CHANNEL_ID")
            .setPriority(Notification.PRIORITY_HIGH)
            .setVibrate(new long[0]);

现在你应该能够正确地看到弹出通知了。


0

我也遇到了同样的问题。解决方法很简单,只需要正确设置震动 builder.setVibration(NotificationCompat.DEFAULT_VIBRATE)

根据谷歌的说法:

在运行 Android 7.1(API 级别 25)及以下版本的设备上,通知具有高优先级并使用铃声或振动。

希望能对你有所帮助 :)


0

尝试做这个:

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
                                .setSmallIcon(android.R.drawable.arrow_up_float)
                                .setContentTitle("Check running time - click!")
                                .setContentText(String.valueOf(elapsedTime))
                                .setContentIntent(pendingIntent)
                                .setDefaults(Notification.DEFAULT_ALL)
                                .setPriority(Notification.PRIORITY_HIGH)
                                .setVibrate(new long[0]);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0, notificationBuilder.build());

-1

就像这样使用

 NotificationManager mNotificationManager = (NotificationManager)
            this.getSystemService(Context.NOTIFICATION_SERVICE);

    Intent myintent = new Intent(this, MainActivity.class);
    myintent.putExtra("message", msg);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            myintent, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.ic_launcher)
                    .setContentTitle("ttile")
                    .setStyle(new NotificationCompat.BigTextStyle()
                            .bigText(msg))
                    .setContentText(msg);

    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(1, mBuilder.build());

调用setStyle()会有什么帮助呢?还是不起作用。 - Paweł Poręba
请确保导入 import android.support.v7.app.NotificationCompat;。 - Enamul Haque
安卓版本 - Enamul Haque
我正在使用24.4.1版本。 - Paweł Poręba
我认为它应该可以工作。请检查并同步FCM库,然后运行... - Enamul Haque

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