Android音量调节的实现,分两种情况说明,一种是在settings的音量设置界面,按下侧键进行调节;另一种是在非settings界面,按下侧键进行音量调节。这两种调节方式的实现不一样,分别操作的是两个不同的音量SeekBar。下面,分别进行分析:


一. 在settings的音量设置界面,按下侧键进行调节:

在settings的音量设置界面,按下侧键回有音量的调节,同时,会播放音乐(这个音乐是在铃声设置中设置的),整个过程的实现的相关代码如下:
1. settings的音量设置界面:
文件: packages/apps/Settings/src/com/android/settings/RingerVolumePreference.java
说明: 在这个RingerVolumePreference,会调用 audioManager.setStreamVolume进行音量大小的调节,但是,播放声音却不在这个文件中。
2. 播放音乐:
文件: frameworks/base/core/java/android/preference/VolumePreference.java
说明:RingerVolumePreference继承自VolumePreference,当点击侧键时,VolumePreference的onKey函数会收到键值,并通过mSeekBarVolumizer.changeVolumeBy, sample, mRingtone.play 最终播放出音乐。

值得注意的是:mRingtone.play用的是 new MediaPlayer 的方式,通过创建MediaPlayer来实现音乐的播放。


二. 在非settings界面按侧键进行音量的调节:

实现: 通过RingtoneManager会调用到AudioManager的adjustStreamVolume,进而调用AudioServicer的adjustStreamVolume,最主要的就是这个函数了。

在这个函数中:

1. checkForRingerModeChange(oldIndex, direction); oldIndex指的是知之前的音量,direction表明是增加还是降低音量。见名知意,这个函数用于检测改变铃声模式,如振动,静音等,是通过调用setRingerMode函数来实现的。而setRingerMode通过发送广播(调用broadcastRingerMode函数)来通知模式的改变。

2. sendMsg: 发送消息,处理这个消息的是handleMessage函数,调用setStreamVolumeIndex来调节音量,其实,最终是通过AudioPolicyService的对应函数实现的。

3. mVolumePanel.postVolumeChanged(streamType, flags); // 用于更新UI.

4. sendVolumeUpdate: 会发送AudioManager.VOLUME_CHANGED_ACTION,处理这个intent的是最终的目的是用于播放那个短促的蜂鸣声(见ToneGenerator.java的startTone)。

5. ToneGenerator.java的startTone的分析: 通过jni调用到ToneGenerator.cpp的startTone函数。


值的注意的是,最终是通过AudioTrack来实现这个声音的处理的,而不是创建MediaPlay, 这与settings中的处理方式是不同的。


题外话: 来电的声音播放方式也是通过Ringtone,创建MediaPlay来实现的。



更多相关文章

  1. Android调用WCFRest
  2. 闲聊c/c++ 1: 用c/c++混合编程方式为ios/android实现一个自绘日
  3. Android系统搜索对话框(浮动搜索框)的使用
  4. 思考Android架構(一):What & Why《Android的UI控件是单线程》?
  5. Android学习笔记:服务(Service)
  6. Binder框架在Framework层的C++中的使用
  7. android 群英传笔记----Android(安卓)scroll
  8. Android中AES加密解密。解决密文不唯一、解密不出明文问题
  9. 基于迅为4412精英版连接SIM7100C模块Android下调试——RIL库分析

随机推荐

  1. 浅谈android的selector背景选择器
  2. android:listview实现qq,微信好友列表(头像
  3. 编译移植android 2.3到tiny210
  4. 关于Android短信管理
  5. Android启动脚本init.rc
  6. 【Android】20.0 第20章 音频、视频、拍
  7. Android(安卓)Makefile分析
  8. Android开发者必须深入学习的10个应用开
  9. android 2d物理引擎-Box2d
  10. Android(安卓)实用工具Hierarchy Viewer