Android通知未显示

问题描述 投票:95回答:8

我需要一个能在Android上添加通知的程序。当有人点击通知时,它应该引导他们进行第二次活动。

我已经建立了代码。通知应该有效,但由于某种原因它无法正常工作。 Notification根本没有显示。我不知道我错过了什么。

这些文件的代码:

Notification n = new Notification.Builder(this)
        .setContentTitle("New mail from " + "[email protected]")
        .setContentText("Subject")
        .setContentIntent(pIntent).setAutoCancel(true)
        .setStyle(new Notification.BigTextStyle().bigText(longText))
        .build();

NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Hide the notification after it's selected

notificationManager.notify(0, n);
android notifications
8个回答
359
投票

没有图标,代码将无法运行。因此,将setSmallIcon调用添加到构建器链中,以便它可以工作:

.setSmallIcon(R.drawable.icon)

Android Oreo (8.0) and above

Android 8引入了一个使用channelId设置NotificationChannel属性的新要求。

private NotificationManager mNotificationManager;

NotificationCompat.Builder mBuilder =
    new NotificationCompat.Builder(mContext.getApplicationContext(), "notify_001");
Intent ii = new Intent(mContext.getApplicationContext(), RootActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, ii, 0);

NotificationCompat.BigTextStyle bigText = new NotificationCompat.BigTextStyle();
bigText.bigText(verseurl);
bigText.setBigContentTitle("Today's Bible Verse");
bigText.setSummaryText("Text in detail");

mBuilder.setContentIntent(pendingIntent);
mBuilder.setSmallIcon(R.mipmap.ic_launcher_round);
mBuilder.setContentTitle("Your Title");
mBuilder.setContentText("Your text");
mBuilder.setPriority(Notification.PRIORITY_MAX);
mBuilder.setStyle(bigText);

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

// === Removed some obsoletes
if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
{
    String channelId = "Your_channel_id";
    NotificationChannel channel = new NotificationChannel(
                                        channelId,
                                        "Channel human readable title",
                                        Android.App.NotificationImportance.Default);
   mNotificationManager.createNotificationChannel(channel);
  mBuilder.setChannelId(channelId);
}

mNotificationManager.notify(0, mBuilder.build());

57
投票

实际上the answer by ƒernando Valle似乎不正确。然后,你的问题过于含糊,因为你没有提到错误或不起作用。

看看你的代码我假设Notification根本没有显示。

您的通知未显示,因为您没有提供图标。即使SDK文档没有提到它是必需的,事实上它实际上非常如此,并且你的Notification不会没有它。

addAction仅在4.1之后可用。在此之前,你将使用PendingIntent发射Activity。你似乎指定了PendingIntent,所以你的问题在于其他地方。从逻辑上讲,必须得出结论,这是缺少的图标。


28
投票

你错过了小图标。我犯了同样的错误,上面的步骤解决了它。

根据官方文档:Notification对象必须包含以下内容:

  1. 一个小图标,由setSmallIcon()设置
  2. setContentTitle()设定的标题
  3. 细节文本,由setContentText()设置
  4. 在Android 8.0(API级别26)及更高版本上,有效的通知通道ID,由setChannelId()设置或在创建通道时在NotificationCompat.Builder构造函数中提供。

http://developer.android.com/guide/topics/ui/notifiers/notifications.html


7
投票

今天这让我感到沮丧,但我意识到这是因为在Android 9.0(Pie)上,默认情况下“请勿打扰”也会隐藏所有通知,而不是像Android 8.1(奥利奥)之前那样对它们进行静音。这不适用于通知。

我喜欢在我的开发设备上使用DND,所以进入DND设置并更改设置以简单地使通知静音(但不隐藏它们)为我修复它。


5
投票

Android 8.1(Oreo)发布通知后,Android版本必须创建通知渠道。如果您的应用中看不到Oreo + Androids的通知,则需要在应用启动时调用以下函数 -

private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name,
       importance);
        channel.setDescription(description);
        // Register the channel with the system; you can't change the importance
        // or other notification behaviours after this
        NotificationManager notificationManager =
        getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
   }
}

1
投票

我想你忘记了

addAction(int icon, CharSequence title, PendingIntent intent)

看这里:Add Action


1
投票

对我来说这是deviceToken的一个问题。请检查数据库中的接收方和发送方设备令牌是否已正确更新,或者您在何处访问它以发送通知。

例如,使用以下命令在应用启动时更新设备令牌。因此它将始终正确更新。

// Device token for push notifications
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
  new OnSuccessListener<InstanceIdResult>() {

    @Override
    public void onSuccess(InstanceIdResult instanceIdResult) {

        deviceToken = instanceIdResult.getToken();

        // Insert device token into Firebase database
        fbDbRefRoot.child("user_detail_profile").child(currentUserId).child("device_token")).setValue(deviceToken)
                .addOnSuccessListener(
                  new OnSuccessListener<Void>() {

                    @Override
                    public void onSuccess(Void aVoid) {

                    }
                });
    }
});

0
投票

我的Android应用程序遇到了同样的问题。我正在尝试通知,并发现通知显示在我的Android模拟器上运行了Android 7.0(牛轧糖)系统,而它没有在我的手机上运行Android 8.1(奥利奥)。

阅读完文档之后,我发现Android有一个名为通知通道的功能,没有它就会在Oreo设备上显示通知。以下是有关通知渠道的官方Android文档的链接。


0
投票

不确定它是否仍处于活动状态,但您还需要更改build.gradle文件,并将使用过的Android SDK版本添加到其中,

实现'com.android.support:appcompat-v7:28.0.0'

在我的案例中,这就像一个魅力

© www.soinside.com 2019 - 2024. All rights reserved.