NotificationChannel在奥利奥播放错误的声音

Sec*_* Eu 5 android android-8.0-oreo android-8.1-oreo

我在运行Android Oreo的设备中使用NotificationChannel声音时遇到这个奇怪的问题.

假设我的项目原始目录中有两个声音文件:

a.mp3
c.mp3
Run Code Online (Sandbox Code Playgroud)

然后在第一次安装app时,我会使用他们的uri将这些声音分配到不同的通知通道(例如):

android.resource://myapp/2131558403 (for sound a.mp3)
android.resource://myapp/2131558404 (for sound c.mp3)
Run Code Online (Sandbox Code Playgroud)

在这一点上,一切都按预期工作.当我开始添加新声音(在前面或中间)时出现问题:

a.mp3
B.mp3 <- new file
c.mp3
Run Code Online (Sandbox Code Playgroud)

然后相应地更改文件的资源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)
Run Code Online (Sandbox Code Playgroud)

所以此时我的第二个通知频道开始播放B.mp3声音文件而不是c.mp3,因为它是用android.resource:// myapp/2131558404 uri 初始化的.

在使用新声音文件编译应用程序后,c.mp3的资源ID已移位.

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

最明显的解决方案是不要在旧文件中间添加新文件,但可能会被遗忘.

也许我可以删除旧频道并再次添加新ID?

或者有没有办法让原始文件具有恒定的资源ID?

Ste*_*tes 0

资源id随机变化,但通知渠道无法更改。为了解决这个问题,您需要为通知通道提供一个不引用资源 id 的文件的符号 uri。

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

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

你应该像这样引用它:

val soundUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
                    context.applicationContext.packageName + "/raw/notification")
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅此答案:/sf/answers/3835754541/