Android 如何禁用通道(API 26+;)上通知更新的声音/振动?

Android 如何禁用通道(API 26+;)上通知更新的声音/振动?,android,notifications,Android,Notifications,我有一个允许用户与通知交互的应用程序。下面是一个简单的用例:当用户点击“操作”时,应用程序会进行一些处理并更新通知以显示进度,然后再次更新以显示操作是否成功 在26之前,我能够在单个通知上设置声音/振动,因此,一旦用户单击“操作”,到进度状态的转换将不会发出声音/振动(我想要的行为),但使用26,这些参数似乎不再受到重视,声音/振动设置仅在频道级别受到重视 我的初始通知应发出声音/振动,但如果我正在更新现有通知(即更改为进度状态),则不应发出声音/振动。有没有办法在API 26及以上版本上实现

我有一个允许用户与通知交互的应用程序。下面是一个简单的用例:当用户点击“操作”时,应用程序会进行一些处理并更新通知以显示进度,然后再次更新以显示操作是否成功

在26之前,我能够在单个通知上设置声音/振动,因此,一旦用户单击“操作”,到进度状态的转换将不会发出声音/振动(我想要的行为),但使用26,这些参数似乎不再受到重视,声音/振动设置仅在频道级别受到重视

我的初始通知应发出声音/振动,但如果我正在更新现有通知(即更改为进度状态),则不应发出声音/振动。有没有办法在API 26及以上版本上实现这一点?

以下是设置初始状态的代码:

private fun sendNotification() {

        val builder = NotificationCompat.Builder(this, "channel_id")
        val defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)

        val intent = Intent(this, MyIntentService::class.java)
        val pIntent = PendingIntent.getService(this, ID, intent, PendingIntent.FLAG_UPDATE_CURRENT)
        val action = NotificationCompat.Action.Builder(
                R.drawable.ic_lock_open_white_24dp,
                "Action",
                pIntent
        ).build()

        builder.setSmallIcon(R.drawable.ic_home_teal_600_24dp)
                .setContentTitle("My Title")
                .setContentText("My content text")
                .setSound(defaultSoundUri)
                .addAction(action)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            val channelName = "My Channel"
            val description = "Channel Description"
            val importance = NotificationManager.IMPORTANCE_DEFAULT
            val channel = NotificationChannel("channel_id", channelName, importance)
            channel.description = description
            notificationManager.createNotificationChannel(channel)

        }
        val manager = NotificationManagerCompat.from(this)
        manager.notify(ID, builder.build())
    }
以及向进度状态的转换(使用相同的id)


在所有API级别上,您都可以通过以下方式禁用通知更新的声音和振动:

如果您只希望在通知尚未显示时播放声音、振动和滴答声,请设置此标志

这将确保对现有通知的更新不会发出声音/振动

private fun updateNotification(notificationId: Int, title: String) {

        //This should NOT make sound or vibrate but it does on 26
        val builder = NotificationCompat.Builder(this, "channel_id");
        builder
                .setSmallIcon(R.drawable.ic_home_teal_600_24dp)
                .setContentTitle(title)
                .setProgress(0, 0, true)
                .setContentText("Processing...")

        val manager = NotificationManagerCompat.from(this)
        manager.notify(notificationId, builder.build())
    }
builder.setOnlyAlertOnce(true)