赞
踩
1.需求:Android 系统出厂默认的音量值过小,需要把音量默认初始值改成音量的最大值.
2.涉及核心代码:
- frameworks/base/media/java/android/media/AudioSystem.java
- frameworks/base/services/core/java/com/android/server/audio/AudioService.java
3.系统音量默认初始值在AudioSystem.java中定义,代码如下:
- /** @hide */
- public static int[] DEFAULT_STREAM_VOLUME = new int[] {
- 4, // STREAM_VOICE_CALL
- 7, // STREAM_SYSTEM
- 5, // STREAM_RING
- 5, // STREAM_MUSIC
- 6, // STREAM_ALARM
- 5, // STREAM_NOTIFICATION
- 7, // STREAM_BLUETOOTH_SCO
- 7, // STREAM_SYSTEM_ENFORCED
- 5, // STREAM_DTMF
- 5, // STREAM_TTS
- 5, // STREAM_ACCESSIBILITY
- 5, // STREAM_ASSISTANT
- };
3.系统音量最大值和最小值定义在AudioService.java 中,代码如下:
- /** Maximum volume index values for audio streams */
- protected static int[] MAX_STREAM_VOLUME = new int[] {
- 5, // STREAM_VOICE_CALL
- 7, // STREAM_SYSTEM
- 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
- 15, // STREAM_ACCESSIBILITY
- 15 // STREAM_ASSISTANT
- };
-
- /** Minimum volume index values for audio streams */
- protected static int[] MIN_STREAM_VOLUME = new int[] {
- 1, // STREAM_VOICE_CALL
- 0, // STREAM_SYSTEM
- 0, // STREAM_RING
- 0, // STREAM_MUSIC
- 1, // STREAM_ALARM
- 0, // STREAM_NOTIFICATION
- 0, // STREAM_BLUETOOTH_SCO
- 0, // STREAM_SYSTEM_ENFORCED
- 0, // STREAM_DTMF
- 0, // STREAM_TTS
- 1, // STREAM_ACCESSIBILITY
- 0 // STREAM_ASSISTANT
- };
------------------------------------------------------------修改方案一---------------------------------------------
在AudioSystem.Java中,修改把默认的音量值改成需要的值,如:把设置里音量中的"媒体音量","通话音量","铃声和通知音量","闹钟音量" 改成最大值.
(1)第一步:对照AudioService.java中的MAX_STREAM_VOLUME数组中的值做相应的修改.
-
- /** @hide */
- public static int[] DEFAULT_STREAM_VOLUME = new int[] {
- 5, // STREAM_VOICE_CALL
- 7, // STREAM_SYSTEM
- 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
- 15, // STREAM_ACCESSIBILITY
- 15, // STREAM_ASSISTANT
- };
(2)步骤二:由于AudioService.java在构造函数中,会覆盖最大值和默认初始值,所以需要把构造函数中从配置文件中取值的代码注释掉,才能让步骤一中修改的数组的值起作用,最后清楚系统数据后便会生效.
-
- /** @hide */
- public AudioService(Context context) {
- this(context, AudioSystemAdapter.getDefaultAdapter(),
- SystemServerAdapter.getDefaultAdapter(context));
- }
-
- public AudioService(Context context, AudioSystemAdapter audioSystem,
- SystemServerAdapter systemServer) {
- sLifecycleLogger.log(new AudioEventLogger.StringEvent("AudioService()"));
- mContext = context;
- mContentResolver = context.getContentResolver();
- mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
-
- mAudioSystem = audioSystem;
- mSystemServer = systemServer;
-
- mPlatformType = AudioSystem.getPlatformType(context);
-
- mIsSingleVolume = AudioSystem.isSingleVolume(context);
-
- mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
- mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
- mSensorPrivacyManagerInternal =
- LocalServices.getService(SensorPrivacyManagerInternal.class);
-
- PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
- mAudioEventWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "handleAudioEvent");
-
- mSfxHelper = new SoundEffectsHelper(mContext);
-
- mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
- mHasVibrator = mVibrator == null ? false : mVibrator.hasVibrator();
-
- mSupportsMicPrivacyToggle = context.getSystemService(SensorPrivacyManager.class)
- .supportsSensorToggle(SensorPrivacyManager.Sensors.MICROPHONE);
-
- mUseVolumeGroupAliases = mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_handleVolumeAliasesUsingVolumeGroups);
-
- // Initialize volume
- // Priority 1 - Android Property
- // Priority 2 - Audio Policy Service
- // Priority 3 - Default Value
- if (AudioProductStrategy.getAudioProductStrategies().size() > 0) {
- int numStreamTypes = AudioSystem.getNumStreamTypes();
-
- for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
- AudioAttributes attr =
- AudioProductStrategy.getAudioAttributesForStrategyWithLegacyStreamType(
- streamType);
- int maxVolume = AudioSystem.getMaxVolumeIndexForAttributes(attr);
- if (maxVolume != -1) {
- MAX_STREAM_VOLUME[streamType] = maxVolume;
- }
- int minVolume = AudioSystem.getMinVolumeIndexForAttributes(attr);
- if (minVolume != -1) {
- MIN_STREAM_VOLUME[streamType] = minVolume;
- }
- }
- if (mUseVolumeGroupAliases) {
- // Set all default to uninitialized.
- for (int stream = 0; stream < AudioSystem.DEFAULT_STREAM_VOLUME.length; stream++) {
- AudioSystem.DEFAULT_STREAM_VOLUME[stream] = UNSET_INDEX;
- }
- }
- }
-
- /*注释开始
- int maxCallVolume = SystemProperties.getInt("ro.config.vc_call_vol_steps", -1);
- if (maxCallVolume != -1) {
- MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = maxCallVolume;
- }
- int defaultCallVolume = SystemProperties.getInt("ro.config.vc_call_vol_default", -1);
- if (defaultCallVolume != -1 &&
- defaultCallVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] &&
- defaultCallVolume >= MIN_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL]) {
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = defaultCallVolume;
- } else {
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] =
- (MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] * 3) / 4;
- }
- int maxMusicVolume = SystemProperties.getInt("ro.config.media_vol_steps", -1);
- if (maxMusicVolume != -1) {
- MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] = maxMusicVolume;
- }
- int defaultMusicVolume = SystemProperties.getInt("ro.config.media_vol_default", -1);
- if (defaultMusicVolume != -1 &&
- defaultMusicVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] &&
- defaultMusicVolume >= MIN_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]) {
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] = defaultMusicVolume;
- } else {
- if (isPlatformTelevision()) {
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] =
- MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] / 4;
- } else {
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] =
- MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] / 3;
- }
- }
- int maxAlarmVolume = SystemProperties.getInt("ro.config.alarm_vol_steps", -1);
- if (maxAlarmVolume != -1) {
- MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM] = maxAlarmVolume;
- }
- 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;
- }
- int maxSystemVolume = SystemProperties.getInt("ro.config.system_vol_steps", -1);
- if (maxSystemVolume != -1) {
- MAX_STREAM_VOLUME[AudioSystem.STREAM_SYSTEM] = maxSystemVolume;
- }
- int defaultSystemVolume = SystemProperties.getInt("ro.config.system_vol_default", -1);
- if (defaultSystemVolume != -1 &&
- defaultSystemVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_SYSTEM]) {
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_SYSTEM] = defaultSystemVolume;
- } else {
- // Default is to use maximum.
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_SYSTEM] =
- MAX_STREAM_VOLUME[AudioSystem.STREAM_SYSTEM];
- }
- 注释结束*/
-
- createAudioSystemThread();
-
- AudioSystem.setErrorCallback(mAudioSystemCallback);
-
- updateAudioHalPids();
-
- boolean cameraSoundForced = readCameraSoundForced();
- mCameraSoundForced = new Boolean(cameraSoundForced);
- sendMsg(mAudioHandler,
- MSG_SET_FORCE_USE,
- SENDMSG_QUEUE,
- AudioSystem.FOR_SYSTEM,
- cameraSoundForced ?
- AudioSystem.FORCE_SYSTEM_ENFORCED : AudioSystem.FORCE_NONE,
- new String("AudioService ctor"),
- 0);
-
- mSafeMediaVolumeState = Settings.Global.getInt(mContentResolver,
- Settings.Global.AUDIO_SAFE_VOLUME_STATE,
- SAFE_MEDIA_VOLUME_NOT_CONFIGURED);
- // The default safe volume index read here will be replaced by the actual value when
- // the mcc is read by onConfigureSafeVolume()
- mSafeMediaVolumeIndex = mContext.getResources().getInteger(
- com.android.internal.R.integer.config_safe_media_volume_index) * 10;
-
- mUseFixedVolume = mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_useFixedVolume);
-
- mDeviceBroker = new AudioDeviceBroker(mContext, this);
-
- mRecordMonitor = new RecordingActivityMonitor(mContext);
- mRecordMonitor.registerRecordingCallback(mVoiceRecordingActivityMonitor, true);
-
- // must be called before readPersistedSettings() which needs a valid mStreamVolumeAlias[]
- // array initialized by updateStreamVolumeAlias()
- updateStreamVolumeAlias(false /*updateVolumes*/, TAG);
- readPersistedSettings();
- readUserRestrictions();
-
- mPlaybackMonitor =
- new PlaybackActivityMonitor(context, MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM]);
- mPlaybackMonitor.registerPlaybackCallback(mVoicePlaybackActivityMonitor, true);
-
- mMediaFocusControl = new MediaFocusControl(mContext, mPlaybackMonitor);
-
- readAndSetLowRamDevice();
-
- mIsCallScreeningModeSupported = AudioSystem.isCallScreeningModeSupported();
-
- if (mSystemServer.isPrivileged()) {
- LocalServices.addService(AudioManagerInternal.class, new AudioServiceInternal());
-
- mUserManagerInternal.addUserRestrictionsListener(mUserRestrictionsListener);
-
- mRecordMonitor.initMonitor();
- }
-
- mMonitorRotation = SystemProperties.getBoolean("ro.audio.monitorRotation", false);
-
- // done with service initialization, continue additional work in our Handler thread
- queueMsgUnderWakeLock(mAudioHandler, MSG_INIT_STREAMS_VOLUMES,
- 0 /* arg1 */, 0 /* arg2 */, null /* obj */, 0 /* delay */);
- }
--------------------------------------修改方案二---------------------------------------------
由于AudioService.java构造函数中会从配置文件中对音量默认值和音量最大值再次赋值,
- int maxCallVolume = SystemProperties.getInt("ro.config.vc_call_vol_steps", -1);
- if (maxCallVolume != -1) {
- MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = maxCallVolume;
- }
-
- //从系统属性"ro.config.vc_call_vol_default"中获取默认电话音量
- int defaultCallVolume = SystemProperties.getInt("ro.config.vc_call_vol_default", -1);
- if (defaultCallVolume != -1 &&
- defaultCallVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] &&
- defaultCallVolume >= MIN_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL]) {
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] = defaultCallVolume;
- } else {
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] =
- (MAX_STREAM_VOLUME[AudioSystem.STREAM_VOICE_CALL] * 3) / 4;
- }
-
- int maxMusicVolume = SystemProperties.getInt("ro.config.media_vol_steps", -1);
- if (maxMusicVolume != -1) {
- MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] = maxMusicVolume;
- }
-
- //从系统属性"ro.config.media_vol_default"中获取默认媒体音量
- int defaultMusicVolume = SystemProperties.getInt("ro.config.media_vol_default", -1);
- if (defaultMusicVolume != -1 &&
- defaultMusicVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] &&
- defaultMusicVolume >= MIN_STREAM_VOLUME[AudioSystem.STREAM_MUSIC]) {
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] = defaultMusicVolume;
- } else {
- if (isPlatformTelevision()) {
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] =
- MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] / 4;
- } else {
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] =
- MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC] / 3;
- }
- }
-
- int maxAlarmVolume = SystemProperties.getInt("ro.config.alarm_vol_steps", -1);
- if (maxAlarmVolume != -1) {
- MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM] = maxAlarmVolume;
- }
-
- //从系统属性"ro.config.alarm_vol_default"中获取默认闹钟和通知音量
- 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;
- }
-
- int maxSystemVolume = SystemProperties.getInt("ro.config.system_vol_steps", -1);
- if (maxSystemVolume != -1) {
- MAX_STREAM_VOLUME[AudioSystem.STREAM_SYSTEM] = maxSystemVolume;
- }
-
- //从系统属性"ro.config.system_vol_default"中获取默认系统音量
- int defaultSystemVolume = SystemProperties.getInt("ro.config.system_vol_default", -1);
- if (defaultSystemVolume != -1 &&
- defaultSystemVolume <= MAX_STREAM_VOLUME[AudioSystem.STREAM_SYSTEM]) {
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_SYSTEM] = defaultSystemVolume;
- } else {
- // Default is to use maximum.
- AudioSystem.DEFAULT_STREAM_VOLUME[AudioSystem.STREAM_SYSTEM] =
- MAX_STREAM_VOLUME[AudioSystem.STREAM_SYSTEM];
- }
所以可以在配置文件中添加对应的属性,并赋值,这样就不需要修改代码.默认Android 源码中并没有给这些属性配值,所以直接添加上去就可以了.其中,配置文件在设备的 /system/build.prop .
- <property name="ro.config.vc_call_vol_default" value="5">
- <property name="ro.config.media_vol_default" value="15">
- <property name="ro.config.alarm_vol_default" value="7">
- <property name="ro.config.system_vol_default" value="7">
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。