98

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 sound is played.

How can I disable this sound?

I tried replacing this sound with a custom mp3 sound in order to then pass it a mp3 with silence in it, but this is ignored.

I'm just adding a notification which is of very low priority, basically giving the user the option to perform some actions after he has interacted with the app. There's no reason to be loud, the user will know that he can refer to the notification because he has done a certain thing with the app which he knows that will cause a notification to appear.

The user will really start getting annoyed by that sound.

Randy Sugianto 'Yuku'
  • 71,383
  • 57
  • 178
  • 228
Daniel F
  • 13,684
  • 11
  • 87
  • 116
  • Does this answer your question? [How to show a notification without a sound java](https://stackoverflow.com/questions/39809702/how-to-show-a-notification-without-a-sound-java) – Marvin Apr 21 '23 at 15:18

18 Answers18

142

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 change the channel ID (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.)

Andreas Haferburg
  • 5,189
  • 3
  • 37
  • 63
mVck
  • 2,910
  • 2
  • 18
  • 20
  • 21
    Uninstall/reinstall, or just rename the NotificationChannel. – Bjarte Aune Olsen Dec 03 '17 at 23:20
  • a channel can be deleted via the API, you don't need to uninstall your app for that – Desolator Dec 23 '17 at 08:17
  • 1
    I think a better solution is to use `NotificationManager.IMPORTANCE_DEFAULT`. This disables the sound and is a good option for importance. Note that if you use `NotificationManager.IMPORTANCE_HIGH` and you show the same notification multiple times it will keep popping up. Using `IMPORTANCE_DEFAULT` also prevents this notification from popping up again if you show the same notification. – Markymark Feb 07 '18 at 05:45
  • 21
    @Markymark WRONG I used `NotificationManager.IMPORTANCE_DEFAULT` and still had a sound when notification is created – user924 May 08 '18 at 08:26
  • 1
    It's a bug in Android. Internally it registers it as `NotificationManager.IMPORTANCE_HIGH`. You can see that when you long-press the notification and dig deeper in the options. Issue sumbitted, but Google doesn't care. – Daniel F Jun 19 '18 at 12:01
  • 4
    NotificationManager.IMPORTANCE_LOW works for me in my music application to disable sound. – Akash Bisariya Jun 27 '18 at 15:37
  • 2
    Using the AndroidX libraries reveals a helper method [NotificationCompat.Builder.setSilent](https://developer.android.com/reference/androidx/core/app/NotificationCompat.Builder#setSilent(boolean)) that effectively sets the sound to null. Source: https://cs.android.com/androidx/platform/frameworks/support/+/androidx-master-dev:core/core/src/main/java/androidx/core/app/NotificationCompatBuilder.java;l=259 – Marvin Dec 05 '20 at 00:18
  • @aeroechelon Correct me if I'm wrong, but setSilent also seems to make the notification not pop up anymore even if it has a high priority. – Florian Walther Aug 25 '21 at 11:10
  • Thx @AkashBisariya , NotificationManager.IMPORTANCE_LOW works perfactly for me as I dont want any sound/vibration. – Ravi Vaniya Sep 07 '21 at 09:32
  • Note that "rename the NotificationChannel" means to change the ID, not the name... – Andreas Haferburg Mar 06 '22 at 11:11
105

(Update 2019-05: It gets worse with Android Q, there I'm even getting a sound when using NotificationManager.IMPORTANCE_LOW, at least in the Emulator...)


The solution is to use NotificationManager.IMPORTANCE_LOW and create a new channel for it. Once a channel is created, you can't change the importance (well, you can, but the new importance is ignored). The channel information appears to get stored permanently by the system and any channel created is only deleted when you uninstall the app. [Update: According to Ferran Negre's comment, you can delete the channel via nm.deleteNotificationChannel(nChannel.getId()); and recreate it with nm.createNotificationChannel(nChannel); but apparently there's a limitation that you can't create a channel with the same id of a deleted channel and expect to be able to apply different settings to the undeleted channel, see acoder's answer]

While previous Android versions played no sound back by default, this changed with Android O, but only when you target the API 26, that is, use Notification Channels. This is an inconsistency, well, actually, it's a bug:

The reason for this is that when you create a channel with NotificationManager.IMPORTANCE_DEFAULT (not soundworthy by default) Android will actually "somewhat" register it as NotificationManager.IMPORTANCE_HIGH (plays sound by default).

You can check this by going into the options of the notifications (long press on the notification entry), where you will get to read that it is of type NotificationManager.IMPORTANCE_HIGH and then disable the notification and then re-enable it. In this process it gets "downgraded" from the NotificationManager.IMPORTANCE_HIGH to the non-sounding, actually registered NotificationManager.IMPORTANCE_DEFAULT.

The bug has been submitted to the Android issue tracker, so you may want to star it (flagged by Google as "Won't Fix (Infeasible)", because... spoiled).


BTW, the new docs at https://developer.android.com/training/notify-user/channels claim that the default behavior used to be that way, that default played a sound prior to Android 8.0, which is definitely not true. This is their list

User-visible importance level           Importance               Priority   
                                        (Android 8.0 and higher) (Android 7.1 and lower)
Urgent  Makes a sound and appears as    IMPORTANCE_HIGH          PRIORITY_HIGH
        a heads-up notification                                  or PRIORITY_MAX
High    Makes a sound                   IMPORTANCE_DEFAULT       PRIORITY_DEFAULT
Medium  No sound                        IMPORTANCE_LOW           PRIORITY_LOW
Low     No sound and does not appear    IMPORTANCE_MIN           PRIORITY_MIN
        in the status bar

You can even see the mismatch between visibility importance high and notification importance high... I don't know why they are doing this. They definitely have a bug in their code.


Everything below the next line is obsolete, yet that bug mentioned there is still valid. My error there was to think that NotificationManager.IMPORTANCE_MIN is the next lower one from NotificationManager.IMPORTANCE_DEFAULT, but NotificationManager.IMPORTANCE_LOW is.


When you then go into the notification settings of the app via long-press-notification and all-channels button and toggle the switch for that channel off and on again, then it actually sets itself to NotificationManager.IMPORTANCE_DEFAULT and no sound will get played. I also noticed that after a crash it did get reset to NotificationManager.IMPORTANCE_HIGH

So basically the workaround is to use NotificationManager.IMPORTANCE_MIN. But you have to create a new channel so that this NotificationManager.IMPORTANCE_MIN is in effect, because it appears that you can't change the importance of an already existing channel once you have created it.

Update: Turns out the workaround with NotificationManager.IMPORTANCE_MIN has a drawback.

When you use that importance level then your notification no longer displays fully inside the notification drawer, but inserts itself in a new Notification Channel Group which is collapsed by default (and will collapse itself again each time the drawer is pulled down). What a bummer!

Update 2: Digging a bit deeper it turns out that it is as if it correctly registered it as NotificationManager.IMPORTANCE_DEFAULT, but somehow it magically got upgraded to NotificationManager.IMPORTANCE_HIGH, like it would when the user explicitly changes the setting from default to high. That one also gets reset to default after turning the notification off and then on again.

Daniel F
  • 13,684
  • 11
  • 87
  • 116
  • 11
    Really important part of this answer: "Once a channel is created, you can't change the importance (well, you can, but the new importance is ignored)." I struggled for a long time, because I didn't get why any of the changes I did to my NotificationChannel were not reflected in the behaviour of the app. I had to rename the channel each time I did a change to it to see the change. – Bjarte Aune Olsen Dec 03 '17 at 23:13
  • new channel id or new channel name, or both new channel id and channel name? – user924 May 08 '18 at 08:24
  • 1
    I set `IMPORTANCE_DEFAULT` and sound was played – user924 May 08 '18 at 08:28
  • Sad to see such a simple bug still not getting fixed. Thank you for jotting down all the details, was going through the same pain. – Kira Jun 25 '18 at 11:04
  • 1
    I think if you do: `nm.deleteNotificationChannel(nChannel.getId());` and `nm.createNotificationChannel(nChannel);` after again. Then the `NotificationManager.IMPORTANCE_LOW` will work (works for me). – Ferran Negre Sep 21 '18 at 17:26
  • @FerranNegre thanks for that information! I don't think I had tried that. Maybe somebody else can confirm that this works? – Daniel F Sep 21 '18 at 17:35
15

Well i will add a complete answer to help. If you read NotificationCompat code from androidx.

   /**
     * Silences this instance of the notification, regardless of the sounds or vibrations set
     * on the notification or notification channel.
     */
    public @NonNull Builder setNotificationSilent() {
        mSilent = true;
        return this;
    }

So you have to use like this if you want remove sound AND vibration.

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
            // no sound or vibration
            .setNotificationSilent()

If you want remove sound only. This is the way.

 // no sound
 builder.setSound(null);

If you want remove viration only.

 // no vibration
 mChannel.setVibrationPattern(new long[]{ 0 });
 mChannel.enableVibration(true);
Zhar
  • 3,330
  • 2
  • 24
  • 25
9

NotificationCompat.Builder.setSilent(true)

This allows you to post a silent notification (no sound or vibration) regardless of the channel's importance setting.

Reference: https://developer.android.com/reference/androidx/core/app/NotificationCompat.Builder#setSilent(boolean)

Marvin
  • 777
  • 8
  • 17
  • 3
    Sounds like a helpful answer. I just want to point out that this is part of the Android Jetpack libraries (`androidx`, which probably most of us use anyway). – Daniel F Dec 02 '20 at 20:45
  • That's working solution for android 12. – electroid Feb 04 '23 at 08:44
  • @electroid NotificationCompat.Builder is apart of the androidx libraries that is backwards compatible. – Marvin Feb 09 '23 at 15:01
8

As far as I have seen, since API 26 (Oreo) it is not possible to change the sound of a notification after it was once created.

    notificationManager.deleteNotificationChannel("channel_id"));
    NotificationChannel notificationChannel = new NotificationChannel(
        "channel_id", "channel_name",
        NotificationManager.IMPORTANCE_HIGH);
    notificationChannel.setSound(null, null);
    notificationManager.createNotificationChannel(notificationChannel);

Even deleting the channel before creation does not help.

Google documentation says:

android.app.NotificationManager public void deleteNotificationChannel(String channelId)

Deletes the given notification channel. If you create a new channel with this same id, the deleted channel will be un-deleted with all of the same settings it had before it was deleted.

NotificationChannel#setSound() documentation states

Only modifiable before the channel is submitted to NotificationManager#createNotificationChannel(NotificationChannel)

Too bad that notificationBuilder.setSound(defaultSoundUri) does not work as well:

This method was deprecated in API level 26. Use NotificationChannel#setSound(Uri, AudioAttributes) instead.

Also using support library does not work. So sound is only settable once in the app and changing by the user is only possible in the settings of the notification. For me Ferran Negre's comment did not work. I do not understand why Google made this restriction. Too bad.

acoder
  • 126
  • 1
  • 5
5

I have tested a lot of android devices,the following code works for me properly

Firstly, create a notificationBuilder, if your Build.Version is bigger than 26, please add a new channel.

  private val notificationBuilder: NotificationCompat.Builder by lazy {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) NotificationCompat.Builder(context) else {
            val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            val channelId = "MUSIC"
            val channelName = "音乐控制栏"
            val importance = NotificationManager.IMPORTANCE_MIN
            val channel = NotificationChannel(channelId, channelName, importance)

            manager.createNotificationChannel(channel)
            channel.enableLights(false)
            channel.vibrationPattern = longArrayOf(0L)
            channel.enableVibration(false)
            channel.setSound(null, null)
            NotificationCompat.Builder(context, channelId)
        }

    }

Secondly, init this notificationBuilder, and set sound null

   notificationBuilder.setDefaults(Notification.DEFAULT_LIGHTS ).setVibrate( longArrayOf(0L)).setSound(null)

Thirdly,if build.version is bigger than 24, please set its priority.

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            notificationBuilder.priority = NotificationManager.IMPORTANCE_MIN
        }

Hope that works for you.

Cyrus
  • 8,995
  • 9
  • 31
  • 58
4
NotificationManager.IMPORTANCE_LOW

It produces no sound when notification is created as I need the same in my Music Application.

And yes if you have already created a notification channel then either you need to change the channel id or simply uninstall the previous application and install again.

Akash Bisariya
  • 3,855
  • 2
  • 30
  • 42
  • 3
    Thanks. The key information for this to work is not only implementing the above line but also to uninstall then reinstall the application. – TomV May 11 '21 at 13:10
3

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.

PeterPazmandi
  • 533
  • 10
  • 13
2
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())
HongSec Park
  • 1,193
  • 8
  • 9
2

As IMPORTANCE solution has the side effect of no notification popup, I got a final solution is:

  1. adding a silent sound resource which downloaded from below repo
  2. set sound for the channel with the silent sound resource.

https://github.com/anars/blank-audio/blob/master/1-second-of-silence.mp3

Jagger
  • 2,352
  • 2
  • 13
  • 12
0

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)
tsig
  • 148
  • 2
  • 6
  • I think the OP still wants to show a notification. Hiding notification just to get rid of the sound doesn't sound like the right answer. – tir38 Mar 28 '19 at 02:08
0

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

Priyankchoudhary
  • 786
  • 9
  • 12
0
/**
 * Low notification importance: Shows in the shade, and potentially in the status bar
 * (see {@link #shouldHideSilentStatusBarIcons()}), but is not audibly intrusive.
 */
public static final int IMPORTANCE_LOW = 2;

/**
 * Default notification importance: shows everywhere, makes noise, but does not visually
 * intrude.
 */
public static final int IMPORTANCE_DEFAULT = 3;

/**
 * Higher notification importance: shows everywhere, makes noise and peeks. May use full screen
 * intents.
 */
public static final int IMPORTANCE_HIGH = 4;

From the Android doc, only IMPORTANCE_LOW would work without sound.

Abhishek Kumar
  • 4,532
  • 5
  • 31
  • 53
-1

No need to use .setSound(null, null)

just use below code

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this,
                getString(R.string.notification_channel_id))
                .setContentTitle("Audio Recording")
                .setContentText("recording in progress")
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                .setSmallIcon(R.mipmap.ic_launcher);

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(
                    getString(R.string.notification_channel_id), "AOD+", NotificationManager.IMPORTANCE_LOW
            );
            channel.setDescription("Call Recorder is running");
            channel.setShowBadge(true);
            channel.canShowBadge();
            channel.setLightColor(Color.GREEN);
            channel.enableVibration(false);

            assert notificationManager != null;
            notificationManager.createNotificationChannel(channel);
        }

        assert notificationManager != null;
        startForeground(256/* must be greater than 0*/, notificationBuilder.build()); //I am using this for audio recording
        //notificationManager.notify(0, notificationBuilder.build());
Dharman
  • 30,962
  • 25
  • 85
  • 135
Khalid Lakhani
  • 179
  • 2
  • 10
-2

First you need to set

importance = NotificationManager.IMPORTANCE_LOW;

then

Notification n = builder.setPriority(Notification.DEFAULT_ALL).build();
n.defaults = 0;
n.defaults |= Notification.DEFAULT_VIBRATE;
Pang
  • 9,564
  • 146
  • 81
  • 122
natsujay
  • 15
  • 2
  • Will you explain what the last code section does? What does `DEFAULT_VIBRATE` have to do with this? – tir38 Mar 28 '19 at 02:10
-2

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);
ॐ Rakesh Kumar
  • 1,318
  • 1
  • 14
  • 24
Kuldip Sharma
  • 782
  • 1
  • 6
  • 8
  • 2
    Yes, that is what the accepted answer as well as the answers from Jun 27 and May 16 state, the latter two also with better code formatting. – Daniel F Jul 25 '18 at 13:28
-2
NotificationManager.IMPORTANCE_LOW

This will work but also collapsed your notification.

Pang
  • 9,564
  • 146
  • 81
  • 122
Nicky
  • 885
  • 9
  • 21
  • This is a noteworthy side-effect if it is true. I can't confirm it, since I use custom notifications, and they don't collapse. On what OS version is this happening to you? I had this happening with `NotificationManager.IMPORTANCE_MIN` – Daniel F Sep 11 '18 at 09:08
  • Custom notification collapse too if you pass 2 notifications small and large BTW I'm using the 8.1 API device. – Nicky Sep 18 '18 at 04:20
  • 1
    What does this answer add that @DanielF and Akash's answer's don't already contain? – tir38 Mar 28 '19 at 02:07
-2

NotificationManager.IMPORTANCE_LOW will work for sure

Akshay Paliwal
  • 3,718
  • 2
  • 39
  • 43
SHUBHAM
  • 1
  • 1