最近在适配android O,遇到个问题,应用中原本有设置界面通过RingtonePreference 选择铃声,set到notification中,弹出通知的时候notification播放该铃声,由于需要较明显的提醒用户,所以使用的是alarm类型的铃声(铃声时间长)。
然而到了O上,所有notification必须强制使用notification channel, 一旦使用了这个,notification的铃声就由系统设置同一管理了,而且供选择的铃声范围限制在了预置的notification类型铃声(短促)和用户自己的音乐等,原本想使用alarm类型的铃声这些没法选了。
于是稍微研究了一下这个notification channel,发现应用在创建的时候可以通过setSound() 方法来预置一个铃声,于是赶紧把期望的alarm铃声传进去。发现notification弹出时确实是播放的预期的铃声,可是到了notification channel 的设置界面一看,由于传入的铃声不在它选择铃声的范围内,所以界面上会显示勾选的是它的默认通知铃声,这是一个bug,还有,一旦你在这个设置里修改了铃声,你再也没法用回之前期望的alarm铃声了,无论是在代码里update channel 也好,删除channel再重新创建也好,都没法修改铃声了(参考官方文档,居然就是这么设计的!),除非应用卸载重装或者清除数据,真是坑爹!
所以凡是使用notification并且有自定义notification铃声的应用,到了android O上都会有这样的问题。
Google的本意其实挺好,应用自己不需要在维护通知铃声相关的设置,统一放在系统设置由用户去选,而且既然是notification,就应该用notification类型的铃声,原本就是android的设计规范。就是苦了国内无数自定义铃声的app了。
目前看来解决办法只有 1.改需求 2.应用自己用mediaplayer播放铃声,然而这又是一个巨深的坑,铃声得跟着notification的生命周期走,还有无数特殊情况需要考虑(来电,静音,录音中等等等等,曾经趟过,惨不忍睹)