android - 如何为频道上的通知更新禁用声音/振动(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)
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())
}
解决方案
在所有 API 级别上,您可以使用setOnlyAlertOnce()禁用通知更新的声音和振动:
如果您只想在通知尚未显示时播放声音、振动和提示符,请设置此标志。
builder.setOnlyAlertOnce(true)
这将确保对现有通知的更新不会发出声音/振动。
推荐阅读
- r - R lavaan 上的 CFA
- ubuntu-16.04 - Greenbone Security Assistant 7.0.3 主机 HTTP 标头
- python - 我应该使用什么编码来打开带有波浪字符的大字母 N 的文件?
- c# - SoapHttpClientProtocol.Invoke 正在发出 POST 请求,我希望它发出 GET,我该怎么做?
- c - 对动态数组结构使用免费的问题
- oracle - oracle pl/sql utl_file ORA-29280: 无效的目录路径
- javascript - 在浏览器中从外部阅读器设备读取条形码
- vba - 用水平定义的区域内的值填充空空白单元格
- bulma - 如何使布尔玛的“导航栏项目”中的字段更宽?
- jquery - Visual Studio 2017 react/redux 项目中的引导错误“未定义 jQuery”