Звуки канала уведомлений Android перестают работать при использовании звуковых URI, которые ссылаются на идентификаторы ресурсов - PullRequest
0 голосов
/ 21 февраля 2019

Мы создали каналы уведомлений для устройств, работающих на Oreo и выше, которые используют пользовательский звук уведомлений, который находится в нашей папке /res/raw.Недавно, когда пользователи обновили наше приложение, звук уведомлений просто перестал работать, и уведомление только вибрирует устройство.

Мы подтвердили, что удаление / переустановка или очистка данных приложения решает проблему.Однако для того, чтобы звуки уведомлений снова работали для всех без переустановки, нам необходимо по существу удалить и заново создать эти каналы.

Мы создаем канал уведомлений следующим образом:

fun initNotificationChannel(channel: PSSNotificationChannel) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val id = channel.id
            val name = context.getString(channel.nameResId)
            val importance = channel.importance
            val channel = NotificationChannel(id, name, importance)

            ...

            // Default sound
            val soundUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
                    context.applicationContext.packageName + "/" + R.raw.notification)
            val audioAttributes = AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .build()
            channel.setSound(soundUri, audioAttributes)

            val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager?
            notificationManager?.createNotificationChannel(channel)
        }
    }

Я подтвердил, что файл все еще существует в /res/raw.И коммит, который, казалось, вызвал это, был просто некоторыми добавленными / измененными файлами в папку /res.

1 Ответ

0 голосов
/ 21 февраля 2019

Кажется, что эта проблема устанавливает soundUri следующим образом:

val soundUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
                    context.applicationContext.packageName + "/" + R.raw.notification)

Похоже, значение R.raw.notification изменилось с 2131689979 (версия, в которой работает звук) на 2131755515 (версия, где звук не работает).И поскольку вы не можете изменить звук уведомлений с помощью каналов уведомлений, я почти уверен, что канал пытается разрешить soundUri со старым идентификатором ресурса (android.resource://our.package.name/2131689979).

Я думаю, что лучший подход - ссылаться на файл напрямую по имени следующим образом:

val soundUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
                    context.applicationContext.packageName + "/raw/notification")

Я также заметил, что такие приложения, как Facebook Messenger и Slack, используют общедоступную папку уведомлений, в которую они, вероятно, просто копируютфайл и ссылка на этот точный путь.Это также позволяет пользователю повторно выбирать звук, предоставляемый приложением, поскольку он виден в файловой системе.

...