Disable sound from NotificationChannel

前端 未结 15 1268
时光说笑
时光说笑 2020-11-27 15:50

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

相关标签:
15条回答
  • 2020-11-27 16:39

    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

    0 讨论(0)
  • 2020-11-27 16:40

    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.

    0 讨论(0)
  • 2020-11-27 16:42

    (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.

    0 讨论(0)
提交回复
热议问题