Android通知未显示


115

我需要一个可以在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);

问问题时请尽量简洁。您没有提到什么是行不通的。实际上,您甚至没有提到某些问题。是Activity不是正在发射?是Notification没有显示?
slinden77

3
@dmmh我在我的问题中说过,我的问题是什么!而且我没有发现任何问题。我的问题是关于这个问题的。如果您不是专家,则无需戳!tato469的回答很好。
Choudhury,13年

3
我要指出的是,此站点的目的不是让您解决问题,而是让其他人也能够找到解决问题的方法。我不是在戳。对不起,我伤了您的感情,但事实是您的问题是错误的,答案是错误的,所有这些令人误解的信息将导致其他新手程序员遇到与您描述的问题相同的问题,并尝试使用不起作用的解决方案根据您提供的代码。无论我是否是专家,这都无关紧要。尤其是因为我没错,您的问题含糊不清,而另一个答案是错误的。
slinden77

我将要求删除此问题和答案,因为它具有误导性。祝你有美好的一天。
slinden77

1
改变了问题,使人们可以理解问题所在。
Choudhury,13年

Answers:


411

没有图标,代码将无法正常工作。因此,将setSmallIcon调用添加到构建器链,如下所示:

.setSmallIcon(R.drawable.icon)

Android Oreo(8.0)以上

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

如何获得CHANNEL_ID?请帮助
Ananta Prasad

@LAnantaPrasad CHANNEL_ID是您的标识符。这是您将通知分组的依据,例如聊天对话或群聊。
Casey Daniel

谢谢,setChannelId是必需的。在添加之前,通知会显示在SONY设备上,而不显示在SAMSUNG设备上。
Wesely


2
还要包括该检查项,if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ mBuilder.setChannelId(channelId); }因为如果没有此检查项,即使您的设备API> = 26,也不会显示通知。
Koushik Shom Choudhury

57

实际上,ƒernandoValle的答案似乎并不正确。再说一遍,您的问题过于含糊,因为您没有提及出什么问题或不起作用。

查看您的代码,我认为Notification简单代码没有显示。

您的通知未显示,因为您未提供图标。即使SDK文档没有提到它是必需的,但实际上它是如此,您Notification将一无所获。

addAction仅从4.1开始可用。在此之前,您可以使用PendingIntent来启动Activity。您似乎指定了PendingIntent,所以问题出在其他地方。逻辑上,必须得出结论,这是缺少的图标。


我发现了那个问题。但感谢您的正确答复。非常感谢您的帮助。
Choudhury,13年

1
您说过,addAction仅从4.1开始可用,但是这是错误的,我在2.3中使用过。参考手册只讨论按钮,而不是通知:“操作按钮在Android 4.1之前的平台上不会出现。” 您可以点击这里:的addAction包括在android.support.v4.app
ƒernando巴耶

1
OP正在使用Notification.Builder,而不是NotificationCompat.Builder您建议的那样。仅仅因为有一个兼容性库并且可以使用它,并不意味着该功能在常规API中可用。您提供的链接实际上对此进行了规定。Notification.Builder如示例所示,该问题与显然相关。并且兼容性库可能仅在4.1可用后才包含此功能。您的答案具有误导性,因为现在您建议从2.3开始就可以使用它。
slinden77

很抱歉,如果我说错,我的意思是有可能在2.3
ƒernando巴耶

4
啊,图标!!甚至没有意识到它丢失了,但是添加它解决了问题。在控制台中没有看到关于缺少图标的任何有用信息,似乎无声地失败了。
皮特2014年

33

您缺少小图标。我犯了同样的错误,以上步骤解决了该错误。

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


3
这不是真的。如果使用通过setContent的自定义通知布局,则无需标题或文本。
Ray Li

11

这让我今天感到震惊,但我意识到这是因为在Android 9.0(Pie)上,默认情况下“ 请勿打扰”还会隐藏所有通知,而不是像在Android 8.1(Oreo)和之前那样仅使它们静音。这不适用于通知。

我喜欢在我的开发设备上启用DND,因此进入DND设置并更改设置以仅使通知静音(但不隐藏通知)为我解决了该问题。


9

对于Android 8.1(Oreo)之后的Android版本,必须强制创建通知通道,以使通知可见。如果在Oreo + Android的应用程序中看不到通知,则在应用程序启动时需要调用以下函数-

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)

在这里查看:添加操作


1
该方法addAction()不适用于Notification.Builder
slinden77

1
它确实存在,但已弃用。相反,您可以传递Action可以使用创建的实例Notification.Action.Builder。PS,始终使用COMPAT替代(即NotificationCompat),因为谷歌倾向于修补漏洞,并提供更好的兼容性与他们
格克汗阿克尔巴里斯

如果您不想指定任何操作,请.setContentIntent(null)与构建器一起使用。
格克汗阿克尔巴里斯


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) {

                    }
                });
    }
});

这在哪里deviceToken宣布?
彼得·莫滕森

为什么是onSuccess空的?
Peter Mortensen

@PeterMortensen ..成功后,您可以执行逻辑上允许的所有事情,例如开始新的意图,敬酒或保留在同一页面上。至于deviceToken声明,您可以在页面中的onCreate之前将其声明为Private String deviceToken
DragonFire

(为了使我自己的评论更清楚:有两个onSuccesss-我指的是内部一个(空的))
Peter Mortensen

1

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

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

就我而言,这就像一种魅力。


0

如果您一个接一个地快速显示通知或取消现有通知,然后立即再次显示通知(例如,触发提示通知以通知用户正在进行的通知中的更改),则可能不会显示通知。在这些情况下,系统可能会在感觉到通知对于用户来说太过于压倒性/垃圾邮件时决定仅阻止该通知。

请注意,至少从外部来看,至少在现有的Android设备(经过10个测试)上,此行为看起来有些随机:它只是有时发生而有时则没有。我的猜测是,在很短的时间阈值内,不允许您发送太多通知。调用NotificationManager.cancel(),然后NotificationManager.notify()有时可能会导致此行为。

如果您有此选项,则在更新通知时,请不要先取消它,而只需NotificationManager.notify()使用更新后的通知进行调用即可。这似乎不会触发系统的上述阻止。


-1

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

int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);

1
“一个版本> =“是什么意思?您是说“版本8.1(或更高版本)”吗?请通过编辑您的答案来回应,而不是在注释中(适当时在此处)。
彼得·莫滕森

@PeterMortensen原谅我,这只是一种类型,感谢我的纠正
Faisal Naseer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.