Android Push notification sound is played only when app is in foreground but not playing sound when app is in background

16,274

Solution 1

Since onMessageReceived() is not called when a notification object is sent, I've created a BroadcastReceiver to handle it when a notification arrives:

public class NotificationReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    playNotificationSound(context);
}

public void playNotificationSound(Context context) {
    try {
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Ringtone r = RingtoneManager.getRingtone(context, notification);
        r.play();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

and added it to manifest. The Receiver is responsible to play the notification ringtone.

 <receiver
        android:name=".notification.NotificationReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
 </receiver>

Solution 2

When sending notifications in Android through the Firebase Console, it will be treated as a Notification Message. Notification messages will always be handled automatically by the Android device (System Tray) when the app is in background (see Handling messages).

Which means that onMessageReceived() will not be called. Hence, if you intend to always play a sound upon receiving a notification, you'll have to make use of a Data Message* instead. But you'll have to send the messages without the use of the Firebase Console.

Solution 3

You need to enable sound in Firebase Notification Composer under Advanced settings. :)

Share:
16,274
Santosh Yadav
Author by

Santosh Yadav

Updated on June 03, 2022

Comments

  • Santosh Yadav
    Santosh Yadav about 2 years

    I am using FCM for push notification below code to play sound when notification received

     public void playNotificationSound() {
            try {
    
                Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
                Ringtone r = RingtoneManager.getRingtone(mContext, notification);
                r.play();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    I am calling this OnMessageReceived Method but the sound is only play when app is in foreground,not playing when app is in background

     @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            Log.e(TAG, "From: " + remoteMessage.getFrom());
    
            if (remoteMessage == null)
                return;
    
            // Check if message contains a notification payload.
            if (remoteMessage.getNotification() != null) {
                Log.e(TAG, "Notification Body: " + remoteMessage.getNotification().getBody());
                handleNotification(remoteMessage.getNotification().getBody());
            }
    
            // Check if message contains a data payload.
            if (remoteMessage.getData().size() > 0) {
                Log.e(TAG, "Data Payload: " + remoteMessage.getData().toString());
    
                try {
                    JSONObject json = new JSONObject(remoteMessage.getData().toString());
                    handleDataMessage(json);
                } catch (Exception e) {
                    Log.e(TAG, "Exception: " + e.getMessage());
                }
            }
        }
    
    
    
    
    
     private void handleNotification(String message) {
            if (!NotificationUtils.isAppIsInBackground(getApplicationContext())) {
                // app is in foreground, broadcast the push message
                Intent pushNotification = new Intent(config.PUSH_NOTIFICATION);
                pushNotification.putExtra("message", message);
                LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification);
    
                // play notification sound
                NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext());
                notificationUtils.playNotificationSound();
            }else if (NotificationUtils.isAppIsInBackground(getApplicationContext())){
                // If the app is in background, firebase itself handles the notification
                NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext());
                notificationUtils.playNotificationSound();
            }
        }
    
  • Njeru Cyrus
    Njeru Cyrus over 5 years
    what is the implementation of handleDataMessage(json)
  • Himesh goswami
    Himesh goswami over 5 years
    it's a custom method that is your for your business you can store on DB , publish an event, do whatever stuff you wanted to do. you can play ring tone as well.