代码之家  ›  专栏  ›  技术社区  ›  Naveed

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

  •  0
  • Naveed  · 技术社区  · 6 年前

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

    example flow

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

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

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

    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)

    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())
        }
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   ianhanniballake    6 年前

    在所有API级别上,您都可以通过使用禁用声音和振动来更新通知 setOnlyAlertOnce()

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

    builder.setOnlyAlertOnce(true)