3

I have implementing FCM for push notification. I am calling this OnMessageReceived Method but the sound is not played when the app is in the foreground and background

here is my code

public class MyFirebaseMessagingService extends FirebaseMessagingService {

public static  String ChannelID = "";
public static final int NOTIFICATION_ID = 1041;
public static boolean IsDriverBusy = false;
private NotificationManager notificationManager;
private SharedPreferences sharedPreferences;
private NotificationChannel mChannel;
private NotificationCompat.Builder notificationBuilder;

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    System.out.println("notificationIntentIs   0000000000000123545 onMessageReceived  " + IsDriverBusy);

    String mTime = getDate(remoteMessage.getSentTime());
    String RiderLOcation = remoteMessage.getData().get("RiderLocation");
    String RiderID = remoteMessage.getData().get("RiderID");
    String Dlat = remoteMessage.getData().get("Dlat");
    String DLong = remoteMessage.getData().get("DLong");
    String Plat = remoteMessage.getData().get("Plat");
    String Plong = remoteMessage.getData().get("Plong");
    String RiderName = remoteMessage.getData().get("RiderName");
    String RiderRating = remoteMessage.getData().get("RiderRating");
    String MainBody = "RiderID:" + RiderID + ";RiderName:" + RiderName + ";RiderLocation:"
            + RiderLOcation + ";PLat:" + Plat + ";PLong:" + Plong + ";DLat:" + Dlat + ";DLong:" + DLong + ";RiderRating:" + RiderRating;
    sharedPreferences = getSharedPreferences("LoginDetail", Context.MODE_PRIVATE);
    if (sharedPreferences.getString("id", "").equals("")) {
        Intent intent1 = new Intent(this, LoginActivity.class);
        startActivity(intent1);

    } else {
        if (!IsDriverBusy) {
            sendNotification(MainBody);
            PreferenceHandler.writeString(this, PreferenceHandler.RIDE_DETAIL, MainBody);
        }
    }

}

private String getDate(long time) {
    Calendar cal = Calendar.getInstance(Locale.ENGLISH);
    cal.setTimeInMillis(time * 1000L);
    String date = DateFormat.format("dd-MM-yyyy hh:mm:ss", cal).toString();
    return date;
}

@SuppressLint("WrongConstant")
private void sendNotification(String messageBody) {

    Intent intent = new Intent(this, MainActivity.class);
    Bundle bundle = new Bundle();
    bundle.putString("bookingId", messageBody);
    intent.putExtras(bundle);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent pendingIntent = PendingIntent.getActivity(this,
            0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);
    startActivity(intent);
    ChannelID=getString(R.string.default_notification_channel_id);

    Uri defaultSoundUri = Uri.parse("android.resource://com.my.package/" + R.raw.windchime);
    long[] VIBRATE_PATTERN = {0, 500};

    notificationBuilder = new NotificationCompat.Builder(this, ChannelID)
            .setSmallIcon(R.drawable.logo)
            .setVibrate(VIBRATE_PATTERN)
            .setPriority(Notification.DEFAULT_ALL)
            .setDefaults(Notification.DEFAULT_ALL)
            .setWhen(System.currentTimeMillis())
            .setContentTitle(getResources().getString(R.string.app_name))
            .setContentText(getString(R.string.notificationData))
            .setAutoCancel(true)
            .setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
            .setContentIntent(pendingIntent);

    notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // Since android Oreo notification channel is needed.
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

        AudioAttributes mAudioAttributes=new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .build();

        mChannel = new NotificationChannel(ChannelID, "Qwykr_Channel",
                NotificationManager.IMPORTANCE_HIGH);
        mChannel.setVibrationPattern(VIBRATE_PATTERN);
        mChannel.setImportance(Notification.DEFAULT_ALL);
        mChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
        mChannel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI,mAudioAttributes);
        notificationManager.createNotificationChannel(mChannel);
    }

    notificationManager.notify(NOTIFICATION_ID, notificationBuilder.build());
    clearNotification(NOTIFICATION_ID);
}

public void clearNotification(int ID) {
    Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message message) {

        }
    };
    Runnable doDisplayError = new Runnable() {
        public void run() {

            notificationManager.cancel(ID);
        }
    };
    handler.postDelayed(doDisplayError, 3000);

}

}

and I'm using Xiaomi Redmi 7 pro.I'm checking the phone setting app notification channel the only vibration is enabled not a sound and another option is enabled. How can set a channel like Whatsapp and telegram application? How can I enable all the fields of the screenshot like Sound, Floating Notification, LockScreen Notifications? Here is my app Channel screenshot:

enter image description here

Please Help me out to solve the problem. Thanks in andvance

Mohit Lakhanpal
  • 869
  • 2
  • 7
  • 16

2 Answers2

1

This code is working for me

First You can uninstall your app then try the channel code.

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = CommonUtill.random();
    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.drawable.logo)
                    .setContentTitle(getString(R.string.app_name))
                    .setContentText(messageBody)
                    .setAutoCancel(true)

                    .setSound(defaultSoundUri)
                    .setStyle(new NotificationCompat.BigTextStyle()
                            .bigText(messageBody).setBigContentTitle(getString(R.string.app_name)))
                    .setContentIntent(pendingIntent);

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

    // Since android Oreo notification channel is needed.
    Uri sound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getPackageName() + "/" + R.raw.notification);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {


        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .build();

        NotificationChannel mChannel = new NotificationChannel(channelId,
                getString(R.string.app_name),
                NotificationManager.IMPORTANCE_HIGH);

        // Configure the notification channel.
        mChannel.setDescription("desc");
        mChannel.enableLights(true);
        mChannel.enableVibration(true);
        mChannel.setSound(sound, attributes); // This is IMPORTANT


        if (notificationManager != null)
            notificationManager.createNotificationChannel(mChannel);

    }
    notificationManager.notify(943/* ID of notification */, notificationBuilder.build());
Mohit Lakhanpal
  • 869
  • 2
  • 7
  • 16
0

What type of FCM you are sending? Is it Notification message or Data message? If it is Notification message OnMessageReceived will not be called when app is in the background. The notification will be taken care of by the ststem tray. If you want to run OnMessageReceived while in background use FCM Data message.

EG:

Notification message:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
  }
}

Data message:

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    }
  }
}

More about it here.

MarkWalczak
  • 1,243
  • 3
  • 11
  • 20