S版本为例
方法一:
frameworks/base / core/res/res/values/config.xml
<integer name="config_safe_media_volume_index">10</integer>
<bool name="config_safe_media_volume_enabled">true</bool>
这个原理是在
base/services/core/java/com/android/server/audio/AudioService.java
安全弹框是在
private void onConfigureSafeVolume(booleanforce, String caller) {
boolean safeMediaVolumeEnabled =
SystemProperties.getBoolean("audio.safemedia.force", false)
||mContext.getResources().getBoolean(
com.android.internal.R.bool.config_safe_media_volume_enabled);
最大安全音量是在构造方法里做的默认值, publicAudioService(Context context) {
mSafeMediaVolumeIndex =mContext.getResources().getInteger(
com.android.internal.R.integer.config_safe_media_volume_index) * 10;
更改默认音量也可以在这里改,(当然在AudioSystem里面也有默认数组值。)
比如
int defaultAlarmVolume =SystemProperties.getInt("ro.config.alarm_vol_default", -1);
if (defaultAlarmVolume != -1 &&
defaultAlarmVolume <=MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM]) {
AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_ALARM] =defaultAlarmVolume;
} else {
// Default is 6 out of 7 (default maximum), so scale accordingly.
AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_ALARM] =
6 *MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM] / 7;
}
有个判断是否是超过安全音量的 方法
private boolean checkSafeMediaVolume(intstreamType, int index, int device) {
synchronized (mSafeMediaVolumeStateLock) {
if ((mSafeMediaVolumeState ==SAFE_MEDIA_VOLUME_ACTIVE) &&
(mStreamVolumeAlias[streamType] == AudioSystem.STREAM_MUSIC) &&
((device &mSafeMediaVolumeDevices) != 0) &&
(index >safeMediaVolumeIndex(device))) {
return false;
}
return true;
}
}
所以说其实默认最高音量就是安全音量的话,其实不需要false也不会弹框
方法二:
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
private void showSafetyWarningH(int flags){
if ((flags & (AudioManager.FLAG_SHOW_UI |AudioManager.FLAG_SHOW_UI_WARNINGS)) != 0
|| mShowing) {
synchronized (mSafetyWarningLock) {
if (mSafetyWarning != null) {
return;
}
mSafetyWarning = newSafetyWarningDialog(mContext, mController.getAudioManager()) {
@Override
protected void cleanUp() {
synchronized(mSafetyWarningLock) {
mSafetyWarning =null;
}
recheckH(null);
}
};
/*/tyd/yantao 20230228 remove volumeSafetyWarning dialog
mSafetyWarning.show();
//*/
}
recheckH(null);
}
rescheduleTimeoutH();
}