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:
Please Help me out to solve the problem.
Thanks in andvance
2
Answers
This code is working for me
First You can uninstall your app then try the channel code.
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:
Data message:
More about it here.