NotificationChannel在Oreo中播放错误的声音



我在运行Android Oreo的设备中有一个奇怪的问题。

可以说,我的项目RAW目录中有两个声音文件:

a.mp3
c.mp3

然后,在首次安装应用程序时,我使用其URI(例如(将这些声音分配给不同的通知频道:

android.resource://myapp/2131558403 (for sound a.mp3)
android.resource://myapp/2131558404 (for sound c.mp3)

此时一切都按预期工作。当我开始添加新声音时出现问题(在前面或中间(:

a.mp3
B.mp3 <- new file
c.mp3

资源ID然后相应地更改文件:

android.resource://myapp/2131558403 (for sound a.mp3)
android.resource://myapp/2131558404 (for sound B.mp3)
android.resource://myapp/2131558405 (for sound c.mp3)

因此,在这一点上,我的第二个通知频道开始播放b.mp3声音文件,而不是c.mp3,因为它是用android.resource初始化的://myapp/ 2131558404 uri。

用于C.MP3的资源ID已在使用新声音文件编译应用程序后发生了变化。

因此,解决此问题的解决方案是什么,因为我无法在创建通知通道后修改通知通道。

最明显的解决方案不是在旧文件的中间添加新文件,而可能会忘记。

也许我可以删除旧频道,然后再次使用新ID添加?

或者有一种方法可以使原始文件具有恒定的资源ID?

NotificationChannels持久。进行此类更改时,您需要给频道一个不同的ID,以便挑选更改。

资源IDS随机更改,但通知通道无法更改。为了打击这一点,您需要将通知频道作为未引用资源ID的文件符号URI。

也就是说,而不是引用 R.raw.notification

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

您应该像这样引用它:

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

有关更多详细信息,请参见此答案:https://stackoverflow.com/a/54796493/5301868

最新更新