Today I started targeting API 26 which forced me to use Notification Channels.
My problem is that now on each new notification (including updates to it) an annoying
If you want to keep the importance of your channel and just remove the sound notificationChannel.setSound(null, null);
seems to do the job.
EDIT: Make sure to rename the channel (and delete the old one) to have it applied to existing users. (Channels can be created, but never modified by the app, only the user can.)
For me the solution was to create group notification.
val builder = NotificationCompat.Builder(this)
.setGroupAlertBehavior(GROUP_ALERT_SUMMARY)
.setGroup("My Group")
.setGroupSummary(false)
.setDefaults(DEFAULT_ALL)
.setSound(null)
But in this case, if you send a new notification with a new ID, then it will be grouped with the previous notifications.
If the case is like mine, that I am forced to show a notification for background service and I don't really want to show any notification the solution that worked on 8.0 was:
.setPriority(NotificationManager.IMPORTANCE_NONE)
With this not only I didn't get the annoying sound every 5 minutes but also minimized the appearance of the notification itself.
On 8.1 I didn't have the problem with the sound with following:
.setPriority(NotificationManager.IMPORTANCE_MIN)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel = NotificationChannel(
channelId.toString(), title,
NotificationManager.IMPORTANCE_DEFAULT
)
notificationChannel.setSound(null,null)
notificationChannel.enableVibration(false)
notificationChannel.description = body
if(notificationManager.getNotificationChannel(channelId.toString())==null) {
notificationManager.createNotificationChannel(notificationChannel)
}
if (data["sound"]?.equals("default", true) == true) {//if your app need contorl sound enable
RingtoneManager.getRingtone(
this,
RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
).play()
}
if(pushShake.isTrue() ){//if your app need contorl vibarate enable
val vbmanager= getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vbmanager.vibrate(VibrationEffect.createOneShot(500,VibrationEffect.DEFAULT_AMPLITUDE))
}
}
below code is about notification, but sound,vibrate will not play at API 26 ,so dont worry about setsound or setvibrate
notificationManager.notify(channelId.toInt(), notificationBuilder.apply {
setContentIntent(pendingIntent)
setSmallIcon(R.drawable.img_logo)
setTicker(title)
setNumber(data["badge"]?.toIntOrNull() ?: 0)
setBadgeIconType(NotificationCompat.BADGE_ICON_SMALL)
color = if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
resources.getColorMuteDepre(R.color.colorAccent2)
} else {
Color.parseColor("#ffffff")
}
setContentTitle(title)
setContentText(body)
setWhen(System.currentTimeMillis())
setAutoCancel(true)
setSound(null)
setVibrate(longArrayOf())
if (pushShake.isTrue() && data["sound"]?.equals("default", true) == true) {
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
val vbmanager = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vbmanager.vibrate(500)
}
}else{
if (data["sound"]?.equals("default", true) == true) {
setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
}
if (pushShake.isTrue() ) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
val vbmanager = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vbmanager.vibrate(500)
}
}
}
setStyle(
NotificationCompat.BigTextStyle().bigText(body).setSummaryText(body).setBigContentTitle(
title
)
)
setPriority(NotificationCompat.PRIORITY_DEFAULT)
}.build())
I faced the same issue in the 8.1 and made the below changes. Change the priority of the notification as LOW and it will disable the sound of notification.
NotificationManager.IMPORTANCE_LOW
The code is like following:
NotificationChannel chan1 = new NotificationChannel("default", "default", NotificationManager.IMPORTANCE_LOW);
You can use 2 different notification channel to send notification depending on there priority to user.
If its a high priority notification the send it via
new NotificationChannel("Channel ID", "Channel Name", NotificationManager.IMPORTANCE_HIGH);
Your user will get sound and pop when they will receive a notification.
If you want to send less important notification then use this channel.
new NotificationChannel("Channel ID", "Channel Name", NotificationManager.IMPORTANCE_LOW);
Your user will get a notification with no sound and pop up.
check different priority from here - https://developer.android.com/reference/android/app/NotificationManager