重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
前言
创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于做网站、成都网站制作、神木网络推广、微信小程序定制开发、神木网络营销、神木企业策划、神木品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联公司为所有大学生创业者提供神木建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
声音管理系统用来实现声音的输入和输出、声音的控制和路由等功能,包括主和各种音源的音量调节、声音焦点控制,声音外设的检测和状态管理,声音源输入和输出的策略管理、音效的播放、音轨设置和播放、录音设置和启动等功能。
最近在做定制需求的时候,需要修改系统通知的声音,将其禁用掉,避免第三方应用发送通知时,声音很大吓到用户。索性就把通知声音关掉。下面就说说关闭声音的几种方法,以及修改系统默认声音的方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
本文是基于Android5.1的代码
一、直接修改系统层默认的声音大小
在系统代码frameworks/base/media/java/android/media/AudioService.java的开头定义了两个数组,一个MAX_STREAM_VOLUME 这里面定义了各种声音的最大值(最大值不是100,所以需要AudioManager.getStreamMaxVolume(type)
来获取各个音量的最大值),然后进行设置。
还定义了一个数组DEFAULT_STREAM_VOLUME 这里面则和MAX_STREAM_VOLUME里定义的顺序是一样,表明了各种声音的默认的大小。
此块代码如下:
/** @hide Maximum volume index values for audio streams */ private static int[] MAX_STREAM_VOLUME = new int[] { 5, // STREAM_VOICE_CALL 7, // STREAM_SYSTEMX_STREAM_VOLUMEMAX_STREAM_VOLUMEMAX_STREAM_VOLUME 7, // STREAM_RING 15, // STREAM_MUSIC 7, // STREAM_ALARM 7, // STREAM_NOTIFICATION 15, // STREAM_BLUETOOTH_SCO 7, // STREAM_SYSTEM_ENFORCED 15, // STREAM_DTMF 15 // STREAM_TTS }; private static int[] DEFAULT_STREAM_VOLUME = new int[] { 4, // STREAM_VOICE_CALL 7, // STREAM_SYSTEM 5, // STREAM_RING 11, // STREAM_MUSIC 6, // STREAM_ALARM 5, // STREAM_NOTIFICATION 7, // STREAM_BLUETOOTH_SCO 7, // STREAM_SYSTEM_ENFORCED 11, // STREAM_DTMF 11 // STREAM_TTS };
如果我们需要修改默认的通知声音,则可以将STREAM_NOTIFICATION 前面的数值 5 给为 0即可,这样默认声音就为0 了。
二、修改数据库中的通知声音值
媒体声音这些数据在数据库中都会默认的存放数据,我们知道大多数的数据都是系统初次启动的时候在SettingProvider应用中加载初始化的值,当然通知的声音也在里面。
具体的代码在frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 其中有个方法loadVolumeLevels(db)
此方法则是加载所有默认声音大小的地方,具体代码如下:
stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)" + " VALUES(?,?);"); loadSetting(stmt, Settings.System.VOLUME_MUSIC, AudioService.getDefaultStreamVolume(AudioManager.STREAM_MUSIC)); loadSetting(stmt, Settings.System.VOLUME_RING, AudioService.getDefaultStreamVolume(AudioManager.STREAM_RING)); loadSetting(stmt, Settings.System.VOLUME_SYSTEM, AudioService.getDefaultStreamVolume(AudioManager.STREAM_SYSTEM)); loadSetting(stmt,Settings.System.VOLUME_VOICE, AudioService.getDefaultStreamVolume(AudioManager.STREAM_VOICE_CALL)); loadSetting(stmt, Settings.System.VOLUME_ALARM, AudioService.getDefaultStreamVolume(AudioManager.STREAM_ALARM)); loadSetting(stmt,Settings.System.VOLUME_NOTIFICATION, AudioService.getDefaultStreamVolume(AudioManager.STREAM_NOTIFICATION)); loadSetting(stmt,Settings.System.VOLUME_BLUETOOTH_SCO, AudioService.getDefaultStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO));
我们发现loadSetting中把所有声音相关默认值大小的都写入数据库中了,那么我们就可以从这里下手了,在Settings.System.VOLUME_NOTIFICATION
的设置项中我们就把他设置为0,则系统通知默认的声音就为0 ,我们再看看AudioService.getDefaultStreamVolume这个方法的实现.
public static int getDefaultStreamVolume(int streamType) { return DEFAULT_STREAM_VOLUME[streamType]; }
实际就是返回了我们在方案一中系统里面默认音量大小数组里面的值。所以方案一和方案二实际是一个效果
三、修改ro.config.notification_sound的属性值
此属性值的意思就是通知默认的音乐文件文件名,我们在系统代码build/target/product/full_base.mk 中定义了,如果我们不想有声音那么我们可以将默认值改为不存在的文件,则不会播放通知声音了,当然我们也可以在客户定义的mk中使用PRODUCT_PROPERTY_OVERRIDES 去复写此属性,将其指定为不存在文件或者为空,这样就不会有通知声音响了。
四、修改默认的声音
系统默认了很多的声音,那么我们要修改一些系统里默认的音效文件呢,那么我们可以修改frameworks/base/data/sounds下面文件及文件夹中的声音文件,如果改了名字记得要在mk中将原来的替换为新的名字。这下面的mk的作用是将这些音乐文件全部打包到系统system/media/audio下面各个模块的文件,然后在系统开机的时候,扫描这些文件,将其加入到数据库中,之后在设置中更换声音时,则直接从数据库中查询这些音乐文件,然后供用户选择。
总结
系统的媒体这块是很重也很大的一块,这里只是一点点皮毛,只是用到时查到的,要想系统系统学习还得很多工作需要研究。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对创新互联的支持。