4

I have below payload push notification, send from my server. The notification work in all version, but the sound don't work only on Android Oreo, other Android versions work fine.

{
  "to" : "d4DLcrilLbs...",
   "notification" : {
   "body" : "This is an FCM notification message!",
   "title" : "FCM Message",
   "sound" : "new_sound.wav"
  }
}
Tanveer Munir
  • 1,956
  • 1
  • 12
  • 27
michael
  • 41
  • 4

3 Answers3

2

In oreo you have to set sound with channal

Please change your code with this

 if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O)
    {
        final Uri alarmSound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE
                + "://" + this.getPackageName() + "/raw/notification");
        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .build();
        NotificationChannel channel = new NotificationChannel("MyNotification","MyNotification", NotificationManager.IMPORTANCE_DEFAULT);
        channel.setSound(alarmSound,attributes);
        NotificationManager mgr =getSystemService(NotificationManager.class);
        mgr.createNotificationChannel(channel);

    }

it will work either your app is in background/foreground

0

Notification in Android oreo needs to be registered under the channel otherwise you will not able to generate a notification.

Check out the following article might help you

Click here

0
package com.example.notification;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.media.AudioAttributes;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;

import androidx.core.app.NotificationCompat;

import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;


public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "MyFirebaseMsgService";
    NotificationManager  mNotificationManager;
    NotificationCompat.Builder  mBuilder;
    Context mContext;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        Log.d(TAG, "From: " + remoteMessage.getFrom());

        if (remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data payload: " + remoteMessage.getData());


        }

        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }
        sendNotification(remoteMessage.getNotification().getBody());

    }

    @Override
    public void onNewToken(String token) {
        Log.d(TAG, "Refreshed token: " + token);
        sendRegistrationToServer(token);
    }

    private void handleNow() {
        Log.d(TAG, "Short lived task is done.");
    }


    private void sendRegistrationToServer(String token) {
        // TODO: Implement this method to send token to your app server.
    }


    private void sendNotification(String message) {
        Intent resultIntent=new Intent(getApplicationContext(),MainActivity.class);
        PendingIntent resultPendingIntent = PendingIntent.getActivity(getApplicationContext(),
                0 /* Request code */, resultIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);

//        Uri uri = Uri.parse("android.resource://" + getApplicationContext()
//                .getPackageName() + "/" + R.raw.mix);
        Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);

        mBuilder = new NotificationCompat.Builder(getApplicationContext());
        mBuilder.setSmallIcon(R.drawable.ic_launcher_background);
        mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(),
                R.drawable.ic_launcher_background));
        mBuilder.setContentTitle(message)
                .setContentText(message)
                .setSound(soundUri)
                .setLights(100,200,300)
                .setAutoCancel(false)
                .setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
                .setColor(Color.GREEN)
                .setStyle(new NotificationCompat.BigTextStyle())
                .setContentIntent(resultPendingIntent)
                .setOnlyAlertOnce(true);

        mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel notificationChannel = new NotificationChannel("541201134433333", "MYGET", importance);
            notificationChannel.enableLights(true);
            notificationChannel.setLightColor(Color.RED);
            notificationChannel.enableVibration(true);
            notificationChannel.setShowBadge(true);
            notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
//            notificationChannel.s

            if (soundUri != null) {
                AudioAttributes audioAttributes = new AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                        .setUsage(AudioAttributes.USAGE_ALARM)
                        .build();
                notificationChannel.setSound(soundUri, audioAttributes);
            }

            assert mNotificationManager != null;
            mBuilder.setChannelId("541201134433333");
            mNotificationManager.createNotificationChannel(notificationChannel);

        }

        assert mNotificationManager != null;
        mNotificationManager.notify(0 /* Request Code */, mBuilder.build());
    }
}
  • 1
    Could you add a bit of explanation here? Which calls are crucial? What was the key? – mate00 Jan 30 '20 at 13:47
  • The app is not working when app is at background. How can onMessageReceived work? – Olkunmustafa Aug 26 '21 at 18:32
  • Remove notification field completely from your server request. Send only data and handle it in onMessageReceived() otherwise your onMessageReceived() will not be triggered when app is in background or killed. "data":{ "id": 1, "missedRequests": 5 "addAnyDataHere": 123 }, "to": "fhiT7evmZk8:APA91bFJq7Tkly4BtLRXdYvqHno2vHCRkzpJT8QZy0TlIGs......", "priority": "high" } – Vibhu Vikram Singh Aug 27 '21 at 05:04
  • Don't forget to include "priority": "high" field in your notification request. – Vibhu Vikram Singh Aug 27 '21 at 05:05