25

Our app now has targetSdkVersion 26 (Android 8) and the app uses FCM push notifications.

As FCM documentation prescribes I updated the FCM client library to version 11.2.0:

dependencies {
     compile 'com.google.firebase:firebase-messaging:11.2.0'
}

With this FCM client library update the FCM notifications started to appear on Android devices. Good, but when app is in background it's system who processes the FCM message, so it uses the default Android notification channel named "Miscellaneous", which is not what we want (we have other notification channels and "Miscellaneous" sounds confusing in that list).

As FCM documentation says there is a way to specify default notification channel for FCM messages:

(Optional) Within the application component, metadata elements to set a default icon, color and notification channel (new in Android O) for notifications. Android uses these values whenever incoming messages do not explicitly set icon, color or notification_channel.

However there is no code sample shown (samples are shown only for icon and color). So I just found by googling a sample in Firebase Cloud Messaging Quickstart on github:

<meta-data
    android:name="com.google.firebase.messaging.default_notification_channel"
    android:value="@string/default_notification_channel_id"/>

But it does not work - FCM notifications still appear within the "Miscellaneous" channel. And I see in the logs:

W/FirebaseMessaging: Missing Default Notification Channel metadata in AndroidManifest. Default value will be used.

Of course, I tried to reinstall the app. Still having the issue.

Well, ideally there should be some way to specify notification channel(s) on back-end at the moment of sending the messages. The FCM dev console, which allows to test sending, now has such an option in UI:

enter image description here

And it works fine. However our back-end uses Java Amazon SNS API and I have no idea if that API allows to specify Android notification channel when sending a message (because it'a new Android feature, and Amazon needs time to adopt it). So setting a default notification channel in AndroidManifest.xml would be a valid workaround for now, but it does not work.

Vit Khudenko
  • 27,639
  • 10
  • 56
  • 86

2 Answers2

17

Look at docs: https://firebase.google.com/docs/cloud-messaging/http-server-ref

android_channel_id The notification's channel id (new in Android O).

The app must create a channel with this ID before any notification with this key is received.

If you don't send this key in the request, or if the channel id provided has not yet been created by your app, FCM uses the channel id specified in your app manifest.

Try to include android_channel_id in json you are about to post to fcm. I have no idea why manifest value is not working for you. Try to just add channel to your request, you should get the same effect as from Firebase Console.

Edit: I just realized you are asking for Amazon client integration. Maybe you are able to build json request manually then (I don't know much about Amazon services, sorry).

user1209216
  • 5,410
  • 7
  • 45
  • 95
  • Thanks a lot! I was able to use `android_channel_id` param via Amazon SNS console (just by adding it to JSON payload). This is even better than default notification channel in AndroidManifest.xml, so I am no longer bothered with why it did not work. :) – Vit Khudenko Aug 29 '17 at 12:01
  • 2
    how can i create **android_channel_id** – Mahesh Gawhane Jan 12 '18 at 06:46
  • 2
    The cited link points to a section marked Legacy HTTP Server Protocol, but the main protocol section makes no mention of **android_channel_id** – JulianSymes May 02 '18 at 12:07
  • 1
    @VitKhudenko may I ask what exactly you addded to your json file? thanks – rosu alin May 22 '18 at 09:53
  • 1
    @rosualin, the `android_channel_id` param with the string id value which is specific to my application. – Vit Khudenko May 22 '18 at 11:14
  • What happens if we do not create any notification channel?I read that FCM creates "default notification channel with basic settings".Does that mean I do not have to create a basic notification channel in the app manifest? – user1261913 May 07 '19 at 06:23
  • Have you even read docs? There will be default channel created in this case. – user1209216 May 07 '19 at 11:57
  • android_channel_id will cause bad request: instead, use channel_id credits to li2 answer – Shalabyer Feb 09 '21 at 21:47
10

FCM has migrated to HTTP v1 API:

https://fcm.googleapis.com/v1/projects/{{projectId}}/messages:send

android_channel_id will cause bad request:

"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
  {
    "field": "message.notification",
    "description": "Invalid JSON payload received. Unknown name \"android_channel_id\" at 'message.notification': Cannot find field."
  }

The correct payload should be:

{
    "message": {
        "token": "{{deviceToken}}",
        "notification": {
            "body": "This is an FCM notification message hello 23",
            "title": "FCM Message",
            "image": "https://lumiere-a.akamaihd.net/v1/images/au_moviesshowcase_mulan_poster_r_2_54011055.jpeg?region=0,0,960,1420"
        },
        "android": {
          "notification": {
            "channel_id": "channel_id_1"
          }
        },
        "data": {
            "key1": "42",
            "key2": "sent by 21"
        }
    }
}

see https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#resource:-message

li2
  • 1,594
  • 1
  • 18
  • 31
  • 1
    @VitKhudenko But the problem is `onMessageReceived` won't be getting called when App is in the background if the payload contains `notification` part, which means you cannot put channel id in the payload if you need `onMessageReceived` to be called no matter App is in foreground or background. Totally have no idea how to make both of them working. Lol – li2 Apr 10 '20 at 12:19
  • Hey li2, I have the exact same situation. Did you or somebody else got it working? – Guilherme Ramos May 15 '20 at 04:01
  • @GuilhermeRamos you can add an extra key `"channel_id"` in `"data"` part, then parse the data payload `remoteMessage.data` on `onMessageReceived` callback, then you're able to do whatever you want. – li2 May 15 '20 at 09:14
  • Yeah, that's ok. But what about the app is not "running", it's in the background? – Guilherme Ramos May 16 '20 at 14:51
  • Finally worked after hours of searching, Thanks, man :) – Shalabyer Feb 09 '21 at 21:47