CDrosos
CDrosos

Reputation: 2528

How to play sometimes sound in notifications

I have this code to show a notification which is working as far as to show the notification, but when i run this function again, i dont get any sound.

 public NotificationManager nm;
 ...
 void ShowNotification(string title = "", string message = "", string header = "", bool notify = false)
        {
            if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
            {
                CreateSilentNotificationChannel();
            }

            var text = GetText(Resource.String.Local_service_label);

            // Set the icon, scrolling text and timestamp
            var sinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1);
            var msSinceEpoch = (long)sinceEpoch.TotalMilliseconds;
            PendingIntent contentIntent = PendingIntent.GetActivity(this, 0, new Intent(this, typeof(MainActivity)), 0);
            PendingIntent refreshIntent = PendingIntent.GetActivity(this, 0, new Intent(this, typeof(LocalService)), 0);

            Android.Net.Uri uri = RingtoneManager.GetDefaultUri(RingtoneType.Notification);
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this, currentNotId);
            builder.SetContentTitle(GetString(Resource.String.OddEven_Notifications_AlertTitle))
                .SetContentIntent(contentIntent)
                                  .SetSmallIcon(Resource.Mipmap.ic_launcher)
                                  .SetTicker(text)
                                  .SetWhen(msSinceEpoch)
                                  .SetAutoCancel(false)
                                  .SetOngoing(true)
                                  .SetUsesChronometer(true)
                                  .SetShowWhen(true)
                                  .SetContentTitle(title)
                                  .SetVisibility((int)NotificationVisibility.Public)
                                  .SetSubText(header)
                                  .SetLargeIcon(BitmapFactory.DecodeResource(this.Resources, Resource.Mipmap.ic_launcher))
                                  .SetContentText(message);
            if (notify)
            {
                builder.SetVibrate(new long[] { 0, 400, 200, 200 });
                builder.SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification));
            }

            StickyNotification = builder.Build();
            if (Build.VERSION.SdkInt < BuildVersionCodes.O && notify)
            {

                StickyNotification.Vibrate = new long[] { 0, 400, 200, 200 };
            }

            nm.Notify(NOTIFICATION, StickyNotification);
        }

private void CreateSilentNotificationChannel()
    {
        var channelDescription = "SilentChannelForOddEvenNotification";

        var chan1 = new NotificationChannel(notIDSilent, GetString(Resource.String.app_name), NotificationImportance.High)
        {
            Description = channelDescription,
            Name = GetString(Resource.String.app_name),
        };

        // set the channel properties
        chan1.EnableLights(true);
        chan1.LightColor = Color.Red;
        chan1.SetSound(null, null);
        chan1.EnableVibration(false);
        chan1.SetBypassDnd(true);
        chan1.LockscreenVisibility = NotificationVisibility.Public;

        // finally create the notification channel
        //var manager = (NotificationManager)GetSystemService(NotificationService);
        nm.CreateNotificationChannel(chan1);
    }

i'm running the function ShowNotification() every 5 minutes but if i have the property notify true or false, i don't get any sound, why?

What is the proper way to have a sticky notification that we update regularly and sometimes we want to also have sound?

Upvotes: 1

Views: 478

Answers (2)

Wendy Zang - MSFT
Wendy Zang - MSFT

Reputation: 10968

Beginning with Android 8.0 (Oreo), it would better to set the sound or the proority in Channel. And use the two ways below instead of chan1.SetSound(null, null);.

  1. Use the specific ringtone for notification.

    void CreateNotificationChannel()
    {
     if (Build.VERSION.SdkInt < BuildVersionCodes.O)
     {
         // Notification channels are new in API 26 (and not a part of the
         // support library). There is no need to create a notification 
         // channel on older versions of Android.
         return;
     }
     var alarmAttributes = new AudioAttributes.Builder()
           .SetContentType(AudioContentType.Sonification)
           .SetUsage(AudioUsageKind.Notification).Build();
     var channel = new NotificationChannel(CHANNEL_ID, "FCM Notifications", NotificationImportance.Default)
     {
         Description = "Firebase Cloud Messages appear in this channel"
     };   
       channel.SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Ringtone),alarmAttributes);
     var notificationManager = (NotificationManager)GetSystemService(NotificationService);
     notificationManager.CreateNotificationChannel(channel);
    }
    

For more details, please refer to the link below. specific ringtone firebase notification xamarin.android

  1. Use the custom sound for notification.

    void CreateNotificationChannel1()
    {
     if (Build.VERSION.SdkInt < BuildVersionCodes.O)
     {
         // Notification channels are new in API 26 (and not a part of the
         // support library). There is no need to create a notification 
         // channel on older versions of Android.
         return;
     }
     var alarmAttributes = new AudioAttributes.Builder()
            .SetContentType(AudioContentType.Sonification)
            .SetUsage(AudioUsageKind.Notification).Build();
    
     var path = Android.Net.Uri.Parse("android.resource://com.companyname.NotificationChannelsDemo/" + Resource.Raw.Hello);
     var name = Resources.GetString(Resource.String.channel_name);
     var description = GetString(Resource.String.channel_description);
     var channel = new NotificationChannel(CHANNEL_ID1, name, NotificationImportance.Max)
     {
         Description = description
     };
     channel.SetSound(path, alarmAttributes);
     var notificationManager = (NotificationManager)GetSystemService(NotificationService);
     notificationManager.CreateNotificationChannel(channel);
    }
    

For more info, please check the link below. Custom Notification Sound FireBase

Upvotes: 0

Aniruddh Parihar
Aniruddh Parihar

Reputation: 3103

In the notification payload of the notification there is a sound key.

From the official documentation its use is:

Indicates a sound to play when the device receives a notification. Supports default or the filename of a sound resource bundled in the app. Sound files must reside in /res/raw/anySound.

{
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",

    "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon",
      "sound" : "default"
    }
  }

In the notification payload either you can use "sound" : "default" OR "sound" : "anySound"

In your case might be these lines are problematic

chan1.SetSound(null, null);

if (notify){
   builder.SetVibrate(new long[] { 0, 400, 200, 200 });
builder.SetSound(RingtoneManager.GetDefaultUri(RingtoneType.Notification));
 }

Upvotes: 1

Related Questions