在运行Android Oreo的设备中,NotificationChannel声音存在这个奇怪的问题。
假设我的项目原始目录中有两个声音文件:
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?
答案 0 :(得分:1)
NotificationChannels是持久性的。进行此类更改时,您需要为频道指定一个不同的ID,以便进行更改。
答案 1 :(得分: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://stackoverflow.com/a/54796493/5301868