Уведомления Android звучат непоследовательно в режиме «Не беспокоить», когда два уведомления приходят близко друг к другAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Уведомления Android звучат непоследовательно в режиме «Не беспокоить», когда два уведомления приходят близко друг к друг

Сообщение Anonymous »

У меня есть приложение для Android, которое получает сообщения FCM и отправляет уведомления по двум каналам:
  • Общий канал/канал по умолчанию (IMPORTANCE_DEFAULT)
  • Критический канал (IMPORTANCE_HIGH, setBypassDnd(true))
Критические уведомления должны предупреждать пользователя, даже если включен режим «Не беспокоить» (DND) (когда пользователь это разрешил)
Когда два уведомления (общее + критическое) приходят очень близко друг к другу:
  • Иногда звучит только один звуковой сигнал воспроизводится
  • Иногда критическое уведомление не звучит во время режима «Не беспокоить».
  • Поведение зависит от времени и устройства.
  • Гарантирует ли Android отдельные звуки, когда два уведомления приходят почти в одно и то же время?
  • Есть ли такое поддерживаемый способ обеспечить надежное оповещение о критическом уведомлении во время режима «Не беспокоить» без изменения глобального состояния звука?
  • Это ожидаемое поведение системы уведомлений Android?
Ниже приведены некоторые фрагменты кода:
@HiltAndroidApp
class MyApp : Application() {

override fun onCreate() {
super.onCreate()
initNotification()
}

private fun initNotification() {
FirebaseApp.initializeApp(this)

val audioAttributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build()
val defaultSoundUri =
("android.resource://" + this.packageName + "/" + R.raw.default_notification).toUri()
val channel = NotificationChannel(
getString(R.string.new_default_notification_channel_id),
getString(R.string.default_notification_channel_name),
NotificationManager.IMPORTANCE_DEFAULT
).apply {
setSound(defaultSoundUri, audioAttributes)
}

val criticalAudioAttributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build()
val criticalSoundUri =
("android.resource://" + this.packageName + "/" + R.raw.criticalalert).toUri()
val criticalAlertsChannel = NotificationChannel(
/* id = */ getString(R.string.critical_notification_channel_id),
/* name = */ getString(R.string.critical_notification_channel_name),
/* importance = */ NotificationManager.IMPORTANCE_HIGH
).apply {
setSound(criticalSoundUri, criticalAudioAttributes)
enableVibration(true)
vibrationPattern = longArrayOf(0, 250, 250, 250)
description = getString(R.string.critical_notification_channel_desc)
setBypassDnd(true)
}

val notificationManager: NotificationManager = getSystemService(
NOTIFICATION_SERVICE
) as NotificationManager

notificationManager.createNotificationChannel(criticalAlertsChannel)
notificationManager.createNotificationChannel(channel)
}
}

@AndroidEntryPoint
class MessagingService : FirebaseMessagingService() {

override fun onMessageReceived(message: RemoteMessage) {
val messageData = MessageData(message.data)
val overrideDoNotDisturb = (messageData.isCritical == "1" && notificationManager.isNotificationPolicyAccessGranted)
val notificationId = Random.nextInt(from = 1, until = 1000)
val pendingIntent = messageData.alert?.let { rawAlert ->
val alert = json.decodeFromString(rawAlert)
when (messageData.alertType) {
ALERT_TYPE_INCIDENT -> getIncidentIntent(notificationId, alert.id)
else -> null
}
} ?: safeLet(messageData.title, messageData.body) { title, body ->
getGenericNotificationIntent(notificationId, title, body, messageData.url)
}

val channelId = if (overrideDoNotDisturb) {
getString(R.string.critical_notification_channel_id)
} else {
getString(R.string.new_default_notification_channel_id)
}

val builder = NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.drawable.ic_alert_sa_notification)
.setColor(ContextCompat.getColor(this, R.color.primary))
.setContentTitle(messageData.title)
.setContentText(messageData.body)
.setStyle(NotificationCompat.BigTextStyle().bigText(messageData.body))
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)

if (overrideDoNotDisturb) {
builder.setPriority(NotificationCompat.PRIORITY_MAX)
builder.setCategory(NotificationCompat.CATEGORY_ALARM)

val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager
audioManager.ringerMode = AudioManager.RINGER_MODE_NORMAL
audioManager.setStreamVolume(
AudioManager.STREAM_NOTIFICATION,
audioManager.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION),
AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE
)
notificationManager.notify(notificationId, builder.build())
} else {
// Set a default priority for regular notifications
builder.setPriority(NotificationCompat.PRIORITY_DEFAULT)

// Delay regular notification to allow time for the critical alerts to play first
Handler(Looper.getMainLooper()).postDelayed({
notificationManager.notify(notificationId, builder.build())
}, REGULAR_NOTIFICATION_DELAY)
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... -notificat
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»