web-dev-qa-db-ja.com

RemoteMessageから通知チャネルIDを見つける方法

Android GoogleSamplesに続くアプリ https://github.com/googlesamples/Android-NotificationChannels に通知チャンネルを登録しました

ただし、RemoteMessageから通知チャネルIDを取得するにはどうすればよいので、NotificationBuilderに設定できます。

public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {

@Override
public void onMessageReceived(RemoteMessage remoteMessage) 
{
//int id = remoteMessage.getNotificationChannel(); // -something like this I could not find
}

RemoteMessageオブジェクトでこの値を見つけました

enter image description here

value [3] = "notification_channel_system"であるため、キー値Android_channel_idhttps://firebase.google.com/docs/cloud-messaging/http-server-ref が、デバイスが受信したときに取得できません。

PushNotificationからこのIDを取得し、通知ビルダーに設定するにはどうすればよいですか?

13
Malbac

17.4.0の時点では、それを取得するための公式APIがあります。MarkoGajićの 以下の回答 を参照してください。

古い回答

RemoteMessageオブジェクトは、そのBundle内にチャネルを含みますが、getData()は、特にgcm.で始まるものをすべて取り除きます。残念ながら、これにはgcm.notification.Android_channel_idというチャネルキーが含まれます。

アプリがフォアグラウンドにあるときにプッシュ通知を受信するという私の目的のために、サーバーから送信されたチャネルIDを使用して、システムに表示したいと思っていました。

私は簡単な2行のファイルでこれを実現できます(確かに少しハックです)。

package com.google.firebase.messaging

fun RemoteMessage.getChannel() : String? = zzds.getString("gcm.notification.Android_channel_id")
2
skylerb

getChannelId() を参照してください:

通知からチャンネルIDを取得します。このメソッドは、チャネルの存在の検証を実行せず、マニフェスト定義のデフォルトまたはデフォルトのFCMチャネルにフォールバックしないことに注意してください。

メッセージの送信時に提供されたチャネルIDを返します。それ以外の場合はnullを返します。


Android FCMに関連する通知チャネルで掘り下げましたが、私が得たものは次のとおりです。

現在、通知チャネルIDを取得する機能はありません(akaAndroid_channel_idまたは投稿から-notification_channel_system)。 AFAICT、これは意図したとおりに機能しています。 FCMからのペイロードに含まれる通知チャネルIDは、クライアントによって自動的に処理される必要があるためdocs (emphasis mine)から:

通知のチャンネルID (Android O)の新機能)。

アプリは、このキーを使用した通知を受信する前に、このIDでチャネルを作成する必要があります。

リクエストでこのキーを送信しない場合、または提供されたチャンネルIDがアプリによってまだ作成されていない場合、FCMはアプリマニフェストで指定されたチャンネルIDを使用します。

つまり、 通知チャネルIDを作成する 使用する予定のfirst-アプリケーションインスタンスで通知チャネルを作成することでした。そのようです:

private void initNotificationChannels() {
    NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    String channelIdOne = "com.my.fcm.test.app.test_channel_one";
    CharSequence nameOne = getString(R.string.channel_one_name);
    String descriptionOne = getString(R.string.channel_one_description);
    int importanceOne = NotificationManager.IMPORTANCE_HIGH;

    NotificationChannel channelOne = new NotificationChannel(channelIdOne, nameOne, importanceOne);
    channelOne.setDescription(descriptionOne);
    channelOne.enableLights(true);
    channelOne.setLightColor(Color.GREEN);
    channelOne.enableVibration(false);
    mNotificationManager.createNotificationChannel(channelOne);

    String channelIdTwo = "com.my.fcm.test.app.test_channel_two";
    CharSequence nameTwo = getString(R.string.channel_two_name);
    String descriptionTwo = getString(R.string.channel_two_description);
    int importanceTwo = NotificationManager.IMPORTANCE_DEFAULT;

    NotificationChannel channelTwo = new NotificationChannel(channelIdTwo, nameTwo, importanceTwo);
    // Configure the notification channel.
    channelTwo.setDescription(descriptionTwo);
    channelTwo.enableVibration(false);
    mNotificationManager.createNotificationChannel(channelTwo);
}

そのため、ペイロードが到着すると、クライアント自体がに応じて処理する必要があります

11
AL.

Cloud Messagingバージョン17.4.0以降、RemoteMessage.Notificationクラスは getChannelId() メソッドで拡張されているため、現在正式にサポートされています。

Firebaseリリースノートから:

クラウドメッセージングバージョン17.4.0

通知メッセージに設定されたチャネルIDを取得するためのgetChannelIdメソッドをRemoteMessage.Notificationに追加しました。

1
Marko Gajić

このコードを試してください

public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {

@Override
public void onMessageReceived(RemoteMessage remoteMessage) 
{
    String id = remoteMessage.getNotification().getChannelId()
}
0