使用没有通知渠道的Firebase推送通知

时间:2018-04-12 13:45:08

标签: android firebase firebase-cloud-messaging android-notifications notification-channel

我需要在收到PUSH通知时生成通知,但我还需要在应用程序中发生某些事情时生成通知(用于在设备的通知栏中显示),因此我使用{{1 }} 为了它。

如您所知,Android已对弃用此次调用Notification.Builder:

NotificationCompat.Builder

现在你必须使用这个电话:

Notification.Builder (Context context)

如果您不想指定通知渠道并且想要向应用的所有用户发送常规通知,并且您希望在未处理通知渠道的情况下接收所有安装的应用中的所有通知,会发生什么情况?或者,如果您想在用户按下应用程序中的按钮时在通知栏中创建简单通知,会发生什么?如何在不指定NotificationCompat.Builder (Context context, String channelId) 的情况下显示通知?我的意思是......只是工作到api 26之前和通知渠道出现之前。

如果不在官方文档的任何位置指定通知渠道,就无法查看如何工作。

3 个答案:

答案 0 :(得分:0)

Android 8+上必须使用通知渠道。因此,您必须使用NotificationCompat.Builder(Context context, String channelId)并通过NotificationManager.createNotificationChannel(NotificationChannel channel)在api 26+上创建频道。

关于api< 26,只是不要调用createNotificationChannel,而是让channel id参数(只是一个字符串)。

val builder = NotificationCompat.Builder(context, "a_channel_id")
builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
            .setSmallIcon(R.drawable.ic_notif)
            .setAutoCancel(true)
...
val notificationManager = NotificationManagerCompat.from(context)
notificationManager.notify(NOTIFICATION_ID, builder.build())

在Api 26+上,创建一个频道:

val channel = NotificationChannel("a_channel_id", "channel_name", NotificationManager.IMPORTANCE_HIGH)
channel.description = "channel_description"
channel.enableLights(true)
channel.lightColor = Color.RED
channel.enableVibration(true)
val notificationManager = NotificationManagerCompat.from(context)
notificationManager.createNotificationChannel(channel)

答案 1 :(得分:0)

目前尚无解决方法。最近宣布了通知频道(如果我没记错的话,是最后一次I / O),并且(很可能,如果不是绝对的话)留在这里。我所做的就是这样。

要遵守新标准,我只是实施通知渠道,但仅限于需要。我也在我的应用程序上使用FCM,这里的内容与我的相似 - 这是在我的Application类中:

    private void initFirebase() {
        ... // other Firebase stuff.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) initNotificationChannels();
    }

    @TargetApi(Build.VERSION_CODES.O)
    private void initNotificationChannels() {
        NotificationChannel publicChannel = new NotificationChannel(NOTIFICATION_CHANNEL_PUBLIC,
                NOTIFICATION_CHANNEL_PUBLIC, NotificationManager.IMPORTANCE_DEFAULT);
        publicChannel.setDescription(NOTIFICATION_CHANNEL_PUBLIC);

        NotificationChannel privateChannel = new NotificationChannel(NOTIFICATION_CHANNEL_PRIVATE,
                NOTIFICATION_CHANNEL_PRIVATE, NotificationManager.IMPORTANCE_HIGH);
        publicChannel.setDescription(NOTIFICATION_CHANNEL_PRIVATE);

        NotificationManager mNotificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (mNotificationManager != null) {
            mNotificationManager.createNotificationChannel(publicChannel);
            mNotificationManager.createNotificationChannel(privateChannel);
        }
    }

我的MessagingService有类似的内容:

private static final String NOTIFICATION_CHANNEL_PRIVATE = "my.app.package.name.private";
private static final String NOTIFICATION_CHANNEL_PUBLIC = "my.app.package.name.public";

private void buildNotification(....(other params),String source, String message) {
    String channelId = getChannelId(source);

    Intent resultIntent = new Intent(this, MyActivity.class);
    resultIntent.putExtra(EXTRAS_PARAM_ID, myVal);
    PendingIntent notificationIntent = buildNotificationIntent(channelId, roomId, roomType);

    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, getChannelId(source))
                    .setSmallIcon(R.drawable.ic_sample
                    .setContentTitle(title)
                    .setContentText(message)
                    .setAutoCancel(true)
                    .setDefaults(Notification.DEFAULT_SOUND)
                    .setContentIntent(notificationIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(id, 0, notificationBuilder.build());
}

private String getChannelId(String source) {
    switch(source){
        case PRIVATE:
           return NOTIFIFICATION_CHANNEL_PRIVATE;
        default:
           return NOTIFICATION_CHANNEL_PUBLIC;
    }
}

答案 2 :(得分:0)

我不知道这是否回答了这个问题。但是,在api 26下面有任何频道,只是在我的应用程序上没有做任何事情。

1. instantiate notificationCompat with some channel Id 
//which is irrelevant for api < 26 

2. handle the case of creating notification channel for api 26+

3. bundled it up.

它刚刚起作用。配置通知在api 26下没有任何效果。