androidpush-notificationnotificationsfirebase-notificationsnotification-channel

Android Push Notification Sound is missing (Not Working ) background and foreground on android


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


Solution

  • 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());