一.使用场景
Safe Media,字面意思是安全音量。前提是有耳机插入,并且有音乐或者FM播放,在我们调节音量的时候,如果音量达到安全音量值,会提出系统提示,提醒用户高音量下使用耳机会损坏听力。在用户选择OK后,安全音量失效,声音可以继续调高。但是此时系统开始计时,如果累计达到20h,音量自动强制降到安全音量,并弹出系统提示,提醒用户长时间在高音量下使用会损坏听力。
二.处理逻辑
在音量的调节的实现在AudioService中,AudioService位于frameworks/base/media/java/android/media/下。
在我们点击上下键按钮调节音量时,会调用
private void adjustStreamVolume(int streamType, int direction, int flags,String callingPackage, int uid) {
……
if ((direction == AudioManager.ADJUST_RAISE) &&
!checkSafeMediaVolume(streamTypeAlias, aliasIndex + step, device)) {
Log.e(TAG, "adjustStreamVolume() safe volume index = "+oldIndex);
mVolumeController.postDisplaySafeVolumeWarning(flags);
} else if (streamState.adjustIndex(direction * step, device)) {
// Post message to set system volume (it in turn will post a message
// to persist). Do not change volume if stream is muted.
sendMsg(mAudioHandler,
MSG_SET_DEVICE_VOLUME,
SENDMSG_QUEUE,
device,
0,
streamState,
0);
}
……
}
首先有俩个判断,第一个direction == AudioManager.ADJUST_RAISE判断是否按音量上键,如果按下键就不用检查了。第二个判断是checkSafeMediaVolume(streamTypeAlias, aliasIndex + step, device),是检查aliasIndex + step是否超过安全音量。
private boolean checkSafeMediaVolume(int streamType, int index, int device) {
synchronized (mSafeMediaVolumeState) {
if(!prefs.getBoolean(firstShowSafeDialog,false) && (index > mSafeMediaVolumeIndex) &&