您的位置:首页 > 移动开发 > Android开发

android 音量控制 流程梳理

2014-01-01 00:12 429 查看
Android.media.AudioManager中包含了对android.media.AudioService的跨进程AIDL调用封装。

正常处理过程:

1.调整音量是通过AudioManager间接调用AudioService.adjustStreamVolume方法来完成逻辑处理;

2.AudioService调用VolumePanel画出音量调整界面,并发送音量变动广播消息,

3.StatusBarPolicy,接收广播消息判断是否在状态栏显示静音或振动图标。

问题点:

1.AudioManager如何接收音量调整事件?

答:PhoneWindowManager.interceptKeyBeforeQueueing处理的

WindowManagerService循环读取下面的消息再做分发到窗口接收,在消息分发前会有一个类做消息过滤处理,就是PhoneWindowManager.interceptKeyBeforeQueueing;

比如音量调整、Home键都在这个类里面做特殊处理,详细内容后面会在其它该当再补充

2.谁负责处理音量显示的?

答:AudioManager调用AudioService来显示的。事件触发在AudioManager,代码的执行实现在AudioService中。状态栏是SystemUI的APK包StatusBarPolicy中接收广播消息来处理的。

源码位置:

/frameworks/base/media/java/android/media/AudioManager.java

/frameworks/base/media/java/android/media/AudioService.java

/framework/base/core/java/Android/view/VolumePanel.java

/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarPolicy.java

AudioService.adjustStreamVolume方法完成以下三个功能:

一.音量调整

音量调整分为两步:先查看模式(Ring mode)是否需要调整? 然后再调用调整音量。

调整模式通过调用checkForRingerModeChange(oldIndex, direction);实现,

调整音量通过调用streamState.adjustIndex(direction)实现。

二.向用户显示调整音量的界面

调用mVolumePanel.postVolumeChanged(streamType, flags);发送音量变动消息,向用户显示改变结果。

调用过程VolumePanel.postVolumeChanged->VolumePanel.onVolumeChanged->VolumePanel.onShowVolumeChanged->mToast

三.广播音量有变动的系统事件

AudioService.sendVolumeUpdate(streamType);广播音量有改变的系统事件,状态栏根据这广播事件显示静音或振动图标

状态栏的静音或振动图标显示过程

StatusBarPolicy主要负责在静音模式(silent mode)和振动模式(vibrate mode)下在状态栏(status bar)的右方显示一个代表相应意义的图标。

一.系统启动后,StatusBarPolicy会注册一个Receiver,它可以接收很多种广播,其中就有AudioService在完成每一次的模式和音量更新时发出的两个广播事件

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver()//新一个广播接收类‘

filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);//添加接收的广播消息

filter.addAction(AudioManager.VIBRATE_SETTING_CHANGED_ACTION);

mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);//注册一个Receiver,接收广播消息

二.接收广播,并调用updateVolume调整状态栏显示

else if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) ||

action.equals(AudioManager.VIBRATE_SETTING_CHANGED_ACTION)) {

updateVolume();//调用音量状态栏显示

}

如果我要调整音量的范围从16->32那么直接



AudioService.java

/** @hide Maximum volume index values for audio streams */

private 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

};

这个就是针对各个类型调节音量频度的位置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: