Reputation: 2528
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
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);
.
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
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
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