Oreo中NotificationChannel播放错误的声音

7

我在运行Android Oreo的设备上遇到了关于NotificationChannel声音的奇怪问题。

假设我在项目的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?


你解决了吗?我也遇到了同样的问题。 - Andrea Giancarli
3
不是很需要。现在我只是不删除未使用的音频文件,并确保新文件添加到末尾,通过为它们分配这样的名称:z001_some_file; z002_another_one。虽然这不是最佳解决方案,但由于我不经常更改声音,所以并不是很重要。只是让人烦恼的是我无法删除未使用的文件。 - Secolink Eu
2个回答

2

通知渠道是持久的。当进行此类更改时,您需要为该渠道分配不同的ID,以便更改得到识别。


1
我所做的唯一更改是向项目添加一个新的音频文件。那么,您建议我每次添加或删除项目中的某些音频文件时都删除旧的通知通道,并使用不同的ID重新创建它们吗? - Secolink Eu

0

资源ID会随机更改,但通知渠道不能更改。为了解决这个问题,您需要为通知渠道提供一个符号URI,指向不引用资源ID的文件。

也就是说,不要引用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://dev59.com/H7Lma4cB1Zd3GeqPUAGG#54796493


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接