136

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

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

这些文件的代码:

Notification n = new Notification.Builder(this)
        .setContentTitle("New mail from " + "test@gmail.com")
        .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);
4

14 回答 14

470

没有图标,代码将无法工作。因此,setSmallIcon像这样将调用添加到构建器链以使其工作:

.setSmallIcon(R.drawable.icon)

安卓奥利奥(8.0)及以上

Android 8 引入了channelId使用NotificationChannel.

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.SDK_INT >= Build.VERSION_CODES.O)
{
    String channelId = "Your_channel_id";
    NotificationChannel channel = new NotificationChannel(
                                        channelId,
                                        "Channel human readable title",
                                        NotificationManager.IMPORTANCE_HIGH);
   mNotificationManager.createNotificationChannel(channel);
  mBuilder.setChannelId(channelId);
}

mNotificationManager.notify(0, mBuilder.build());
于 2013-05-08T19:04:13.620 回答
59

实际上ƒernando Valle 的回答似乎并不正确。再说一次,您的问题过于模糊,因为您没有提及错误或无效。

查看您的代码,我假设Notification根本没有显示。

您的通知未显示,因为您没有提供图标。尽管 SDK 文档没有提到它是必需的,但实际上非常需要,而且你Notification不会没有它。

addAction仅从 4.1 开始可用。在此之前,您将使用PendingIntent启动一个Activity. 您似乎指定了 a PendingIntent,因此您的问题出在其他地方。从逻辑上讲,人们必须断定它是丢失的图标。

于 2013-04-28T09:14:35.197 回答
35

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

根据官方文档: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

于 2015-10-02T03:14:02.017 回答
16

这让我今天大吃一惊,但我意识到这是因为在Android 9.0 (Pie) 上,请勿打扰默认情况下也会隐藏所有通知,而不是像在Android 8.1 (Oreo) 及之前的版本中那样将它们静音。这不适用于通知。

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

于 2018-10-16T07:59:32.843 回答
12

对于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);
   }
}
于 2019-01-10T11:25:46.697 回答
2

您还需要更改 build.gradle 文件,并将使用的 Android SDK 版本添加到其中:

implementation 'com.android.support:appcompat-v7:28.0.0'

这对我来说就像一个魅力。

于 2019-06-15T23:53:00.860 回答
1

我想你忘记了

addAction(int icon, CharSequence title, PendingIntent intent)

看这里:添加动作

于 2013-04-16T19:50:38.437 回答
1

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

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

于 2019-03-01T14:16:36.473 回答
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) {

                    }
                });
    }
});
于 2019-04-07T04:40:19.107 回答
0

如果您一个接一个地快速显示通知或取消现有通知,然后立即再次显示通知,则可能不会显示通知(例如,触发提醒通知以通知用户正在进行的通知发生变化)。在这些情况下,系统可能会在感觉通知对用户来说可能变得过于庞大/垃圾邮件时才决定阻止通知。

请注意,从外部来看,至少在现有的 Android(用 10 测试)上,这种行为看起来有点随机:它有时会发生,有时不会。我的猜测是,有一个非常短的时间阈值,在此期间您不允许发送太多通知。调用NotificationManager.cancel()然后NotificationManager.notify()有时可能会导致这种行为。

如果您可以选择,在更新通知时不要取消它,而只需调用NotificationManager.notify()更新的通知即可。这似乎不会触发上述系统阻止。

于 2020-01-27T11:31:10.207 回答
0

如果您在使用通知通道时使用的版本 >= Android 8.1 (Oreo),请将其重要性设置为高:

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
于 2019-09-05T11:21:11.283 回答
0

我遇到了与您类似的问题,在寻找解决方案时,我找到了这些答案,但它们并不像我希望的那样直接,但它给出了一个想法;您的通知可能不会显示,因为对于 >=8 的版本,通知的处理方式相对不同,有一个NotificationChannel有助于管理通知的方法,这对我有帮助。快乐编码。

void Note(){
    //Creating a notification channel
    NotificationChannel channel=new NotificationChannel("channel1",
                                                        "hello",
                                                        NotificationManager.IMPORTANCE_HIGH);
    NotificationManager manager=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    manager.createNotificationChannel(channel); 
    
    //Creating the notification object
    NotificationCompat.Builder notification=new NotificationCompat.Builder(this,"channel1");
    //notification.setAutoCancel(true);
    notification.setContentTitle("Hi this is a notification");
    notification.setContentText("Hello you");
    notification.setSmallIcon(R.drawable.ic_launcher_foreground);   
    
    //make the notification manager to issue a notification on the notification's channel
    manager.notify(121,notification.build());
}
于 2021-06-07T09:16:07.097 回答
0

确保您的 notificationId 是唯一的。我不知道为什么我的测试推送没有显示出来,但这是因为通知 id 是根据推送内容生成的,而且由于我一遍又一遍地推送相同的通知,所以通知 id 保持不变。

于 2022-01-31T06:35:53.790 回答
-2
val pendingIntent = PendingIntent.getActivity(applicationContext, 0, Intent(), 0)

var notification = NotificationCompat.Builder(applicationContext, CHANNEL_ID)
                                    .setContentTitle("Title")
                                    .setContentText("Text")
                                    .setSmallIcon(R.drawable.icon)
                                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                                    .setContentIntent(pendingIntent)
                                    .build()
val mNotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

mNotificationManager.notify(sameId, notification)
于 2021-05-06T13:50:10.780 回答