Как отключить звук / вибрацию для уведомлений на канале (API 26+)? - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть приложение, которое позволяет пользователю взаимодействовать с уведомлениями. Вот простой случай использования: когда пользователь нажимает на «Действие», приложение выполняет некоторую обработку и обновляет уведомление, чтобы показать прогресс, и обновляет его снова, чтобы показать, было ли действие успешным или нет.

example flow

До 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())
    }

И переход в состояние прогресса (с использованием того же идентификатора)

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 Ответ

0 голосов
/ 16 сентября 2018

На всех уровнях API вы можете отключить звук и вибрацию для обновлений уведомлений, используя setOnlyAlertOnce () :

Установите этот флаг, если хотите, чтобы звук вибрировали отметка для воспроизведения, если уведомление еще не отображается.

builder.setOnlyAlertOnce(true)

Это гарантирует, что обновления существующего уведомления не будут звучать / вибрировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...