No notification sound when sending notification from firebase in android

142,701

Solution 1

In the notification payload of the notification there is a sound key.

From the official documentation its use is:

Indicates a sound to play when the device receives a notification. Supports default or the filename of a sound resource bundled in the app. Sound files must reside in /res/raw/.

Eg:

{
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",

    "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon",
      "sound" : "mySound"
    }
  }

If you want to use default sound of the device, you should use: "sound": "default".

See this link for all possible keys in the payloads: https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

For those who don't know firebase handles notifications differently when the app is in background. In this case the onMessageReceived function is not called.

When your app is in the background, Android directs notification messages to the system tray. A user tap on the notification opens the app launcher by default. This includes messages that contain both notification and data payload. In these cases, the notification is delivered to the device's system tray, and the data payload is delivered in the extras of the intent of your launcher Activity.

Solution 2

Try this

{
    "to" : "DEVICE-TOKEN",

    "notification" : {
      "body"  : "NOTIFICATION BODY",
      "title" : "NOTIFICATION TITILE",
      "sound" : "default"
    }
  }

@note for custom notification sound:-> "sound" : "MyCustomeSound.wav"

Solution 3

adavaced options select advanced options when Write a message, and choose sound activated choose activated

this is My solution

Solution 4

The onMessageReceived method is fired only when app is in foreground or the notification payload only contains the data type.

From the Firebase docs

For downstream messaging, FCM provides two types of payload: notification and data.

For notification type, FCM automatically displays the message to end-user devices on behalf of the client app. Notifications have a predefined set of user-visible keys.
For data type, client app is responsible for processing data messages. Data messages have only custom key-value pairs.

Use notifications when you want FCM to handle displaying a notification on your client app's behalf. Use data messages when you want your app to handle the display or process the messages on your Android client app, or if you want to send messages to iOS devices when there is a direct FCM connection.

Further down the docs

App behaviour when receiving messages that include both notification and data payloads depends on whether the app is in the background or the foreground—essentially, whether or not it is active at the time of receipt.
When in the background, apps receive the notification payload in the notification tray, and only handle the data payload when the user taps on the notification.
When in the foreground, your app receives a message object with both payloads available.

If you are using the firebase console to send notifications, the payload will always contain the notification type. You have to use the Firebase API to send the notification with only the data type in the notification payload. That way your app is always notified when a new notification is received and the app can handle the notification payload.

If you want to play notification sound when app is in background using the conventional method, you need to add the sound parameter to the notification payload.

Solution 5

I was also having a problem with notifications that had to emit sound, when the app was in foreground everything worked correctly, however when the app was in the background the sound just didn't come out.

The notification was sent by the server through FCM, that is, the server mounted the JSON of the notification and sent it to FCM, which then sends the notification to the apps. Even if I put the sound tag, the sound does not come out in the backgound.

enter image description here

Even putting the sound tag it didn't work.

enter image description here

After so much searching I found the solution on a github forum. I then noticed that there were two problems in my case:

1 - It was missing to send the channel_id tag, important to work in API level 26+

enter image description here

2 - In the Android application, for this specific case where notifications were being sent directly from the server, I had to configure the channel id in advance, so in my main Activity I had to configure the channel so that Android knew what to do when notification arrived.

In JSON sent by the server:

   {
  "title": string,
  "body": string,
  "icon": string,
  "color": string,
  "sound": mysound,

  "channel_id": videocall,
  //More stuff here ...
 }

In your main Activity:

 @Background
    void createChannel(){
            Uri sound = Uri.parse("android.resource://" + getApplicationContext().getPackageName() + "/" + R.raw.app_note_call);
            NotificationChannel mChannel;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                mChannel = new NotificationChannel("videocall", "VIDEO CALL", NotificationManager.IMPORTANCE_HIGH);
                mChannel.setLightColor(Color.GRAY);
                mChannel.enableLights(true);
                mChannel.setDescription("VIDEO CALL");
                AudioAttributes audioAttributes = new AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                        .setUsage(AudioAttributes.USAGE_ALARM)
                        .build();
                mChannel.setSound(sound, audioAttributes);

                NotificationManager notificationManager =
                        (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.createNotificationChannel(mChannel);
            }
    }

This finally solved my problem, I hope it helps someone not to waste 2 days like I did. I don't know if it is necessary for everything I put in the code, but this is the way. I also didn't find the github forum link to credit the answer anymore, because what I did was the same one that was posted there.

Share:
142,701
Developine
Author by

Developine

Visit my Blog for Programming Tutorials - Developine.com

Updated on June 15, 2021

Comments

  • Developine
    Developine almost 3 years

    I am sending push notification from firebase to my Android Application. but when my app is in background firebase onMessageReceived method is not called instead firebase send notification to system for showing notification in system tray. notification appears in system tray but no sound for notification even i have allowed notification sound for my app in system settings.

    what I can do to play notification sound when notification received from firebase.

    This is how I am sending notification from firebase to my app Blogpost link.

    How to Add firebase in your Android Application

  • Developine
    Developine almost 8 years
    onMessageReceived is not called when app is in background. actually this is problem which i am facing
  • AAA
    AAA almost 8 years
    did you call this(Firebase.setAndroidContext(getApplicationContext()); ) from main activity
  • Developine
    Developine almost 8 years
    no i havent. but now I am playing notification answer from isl worked for me.
  • Brian Vo
    Brian Vo over 7 years
    if you want to use default sound of device, you should use: "sound" : "default"
  • Mattia Ruggiero
    Mattia Ruggiero over 7 years
    @TranVo thanks for points out that "default" value plays the default sound of the device, you saved me a lot of time!
  • Harsha
    Harsha over 7 years
    in the notification am getting response for which screen redirect key if app in foreground and click notification working fine if in backgroung notification clicked open launcher activity onMessageReceived how to handle please help me for both background and foreground handlings
  • santhosh
    santhosh over 7 years
    I tried all the possible ways but not able have that default sound or sound from setting my own tone and also not getting vibration what may be the reason
  • Umashankar B
    Umashankar B about 7 years
    I have done .setSound(defaultSoundUri), but I am not getting notification sound, when send from firebase
  • Ashish Shahi
    Ashish Shahi about 7 years
    please tell me builder is generated error please define builder
  • AAA
    AAA about 7 years
    builder is notificationcompat builder
  • Ashish Shahi
    Ashish Shahi about 7 years
    Your Idea is work But I have required TO change Notification image when Phone is locked How can i change please Help me
  • Ashish Shahi
    Ashish Shahi about 7 years
    I am try You previous Idea But Not work Please Help It is so urgent
  • funky-nd
    funky-nd almost 7 years
    nah, it is also called when the app is closed but u should allowe auto start of the app.
  • Hamzeh Soboh
    Hamzeh Soboh over 6 years
    So where do you put that file? in raw? assets?
  • Ally Makongo
    Ally Makongo about 6 years
    Not assets folder, create a newfolder under res, call it raw. Then copy and paste your wav or mp3 file to that folder. @HamzehSoboh
  • iamatsundere181
    iamatsundere181 almost 6 years
    So how can I disable the sound of the notification?
  • Isj
    Isj almost 6 years
    I assume not including the sound parameter should do it, but please verify
  • Oliver Dixon
    Oliver Dixon over 5 years
    This won't work with the new APIs. Error: Invalid JSON payload received. Unknown name "badge" at 'message.notification': Cannot find field. Also you're using TypeScript (you should be) it will flag this on compilation before you submit it to Firebase
  • Tabish khan
    Tabish khan about 5 years
    how to write this in php ?
  • SudoPlz
    SudoPlz about 5 years
    @Tabishkhan $this->message['message']['android']['notification']['sound'‌​] = "default";
  • Shahid Ghafoor
    Shahid Ghafoor about 5 years
    but I still not getting sound when app is in background.
  • Phong Nguyen
    Phong Nguyen almost 5 years
    @KongJing in Android 8 and above, it always have sound no matter setting of Firebase console. Do you know a way to prevent sound completely?
  • Dan Dinu
    Dan Dinu almost 5 years
    any way to disable the notification sound? Excluding the sound attribute doesn't work, the sound is still enabled
  • KongJing
    KongJing over 4 years
    I am sorry to see this so late, I can't solve this problem.@Think Twice Code Once
  • TPG
    TPG over 4 years
    I have the sound but no vibration, any idea?
  • John Gorenfeld
    John Gorenfeld almost 4 years
    Has the new Notification Channel system obsoleted this API for older devices, or does it still work for older devices? I've been trying to make custom sounds show up for a Nougat device but I just seem to get the default chime sound effect no matter what I enter in "sound" or "soundName." I've tried "mysoundeffect.wav" and "mysoundeffect" with no luck.
  • The Anh Nguyen
    The Anh Nguyen over 3 years
    I put sound into /res/raw/my_sound.mp3 in the Android app then call API with "sound": "my_sound.mp3". Not working, just default sound was played :( Anyone like me ?
  • The Anh Nguyen
    The Anh Nguyen over 3 years
    Oh, I make it worked. Using Android Notification Channel, More detail here: stackoverflow.com/questions/61142155/…
  • Scilef
    Scilef about 3 years
    What about ios sounds?
  • Dave Nottage
    Dave Nottage about 3 years
    @Scilef Please refer to: firebase.google.com/docs/reference/fcm/rest/v1/…. The member corresponding to android for iOS is apns. Inside apns you need a payload member, and inside that you need an aps member which corresponds to the usual aps payload for iOS as per: developer.apple.com/documentation/usernotifications/…