Android 4.2 SafeVolume机制

在项目声压测试失败后,发现Android 4.2系统自带防止音量过度提升的安全机制SafeVolume。本文介绍了如何在Android系统中启用这一机制,并分享了自定义解决方案遇到的问题以及解决心得。
摘要由CSDN通过智能技术生成

 最近一个项目过认证, 在声压测试时failed。整改方案为:在用户将耳机音量提高至安全音量以上时,阻止此操作并弹出警告框,待用户确认后才提升音量。一开始并不知道android4.2中默认自带了这套机制,于是自己瞎琢磨添加了一套机制:在Audioervice中监听插入耳机时的音量变化,发送广播到SystemUI,再在SystemUI中注册Receiver去判断是否需要弹出警告框。历经千辛万苦终于把流程可以跑通,功能也可以实现,但有一个小BUG,就是用户当前提升的音量超过了安全音量,弹出警告框的同时音量也已经完成调节动作,不符合整改方案的要求。后来,无意中看到AudioService中有SafeVolume之类的变量,才恍然大悟,原来android默认就支持这个功能,于是将之前瞎琢磨的那套怒而删之,仔细研究如何开启android默认的机制, 以下是小小的心得,特此记录。

----------------------------------------------------------------------------------------------------

代码位置:frameworks/base/media/java/android/media/AudioService.java

public AudioService(Context context) {
        ..........  //省略
        mSafeMediaVolumeState = new Integer(Settings.Global.getInt(mContentResolver,Settings.Global.AUDIO_SAFE_VOLUME_STATE,SAFE_MEDIA_VOLUME_NOT_CONFIGURED)); 
        mSafeMediaVolumeIndex = mContext.getResources().getInteger(com.android.internal.R.integer.config_safe_media_volume_index) * 10;
         .......... //省略
}

在AudioService的构造函数中,有关于安全音量的初始化设置,从配置文件中读取是否配置安全媒体音量以及安全音量的大小。

是否enable的配置文件在frameworks/base/core/res/res/values-Mcc码 文件夹中:

<!-- Whether safe headphone volume is enabled or not (country specific). -->
<bool name="config_safe_media_volume_enabled">true</bool>

goole了一下,中国的mcc码值为460, mnc为00或者01(对应移动或者联通), 我的这套android代码中没有这个文件夹, 我自己创建了一个并赋值。
配置安全媒体音量大小的文件在:frameworks/base/core/res/res/values/Config.xml中:

<!-- Safe headphone volume index. When music stream volume is below this index the SPL on headphone output is compliant to EN 60950 requirements for portable music players. -->
<integer name="config_safe_media_volume_index">5</integer>

这个index的大小可以根据实际情况进行调整。
再次编译烧录,插入耳机播放音乐,调整音量至第五个梯度时,弹出警告框。
接下来研究这套机制的具体实现流程:
还是刚才的frameworks/base/media/java/android/media/AudioService.java构造方法:

public AudioService(Context context) {
      .................  //省略
      IntentFilter intentFilter = .....;
      intentFilter.addAction(Intent.ACTION_BOOT_COMPLETED);
      .................. //省略
      context.registerReceiver(mReceiver, intentFilter);
}

AudioService的构造方法中监听BOOT_COMPLETED事件,当机器BOOT完成后,做如下操作:

private class AudioServiceBroadcastReceiver extends BroadcastReceiver {
        @Override
         public void onReceive(Context context, Intent intent) {
              ..................
              } else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
                        ................
                        sendMsg(mAudioHandler, MSG_CONFIGURE_SAFE_MEDIA_VOLUME_FORCED, SENDM
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值