Android音量调节的实现(RingtoneManager和RingerVolumePreference)
来源:互联网 发布:jquery 数组排序 sort 编辑:程序博客网 时间:2024/06/01 07:25
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来实现的。
通过程序获取android系统手机的铃声和音量。同样,设置铃声和音量的方法也很简单!
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
//通话音量
int max = am.getStreamMaxVolume( AudioManager.STREAM_VOICE_CALL );
int current = am.getStreamVolume( AudioManager.STREAM_VOICE_CALL );
Log.d(”VIOCE_CALL”, “max : ” + max + ” current : ” + current);
//系统音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_SYSTEM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_SYSTEM );
Log.d(”SYSTEM”, “max : ” + max + ” current : ” + current);
//铃声音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_RING );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_RING );
Log.d(”RING”, “max : ” + max + ” current : ” + current);
//音乐音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_MUSIC );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_MUSIC );
Log.d(”MUSIC”, “max : ” + max + ” current : ” + current);
//提示声音音量
max = am.getStreamMaxVolume( AudioManager.STREAM_ALARM );
current = sm.getStreamVolume( AudioManager.STREAM_ALARM );
Log.d(”ALARM”, “max : ” + max + ” current : ” + current);
设置音量的方法也很简单,AudioManager提供了方法:
public void setStreamVolume(int streamType, int index, int flags)
其中 streamType 有内置的常量,可以在AudioManager里面查到相关的定义。
- Android音量调节的实现(RingtoneManager和RingerVolumePreference)
- Android音量调节的实现(RingtoneManager和RingerVolumePreference) .
- Android音量调节的实现(RingtoneManager和RingerVolumePreference)
- Android音量调节的实现(RingtoneManager和RingerVolumePreference)
- Android音量调节的实现(RingtoneManager和RingerVolumePreference)
- Android音量调节的实现(RingtoneManager和RingerVolumePreference)
- Android音量调节的实现
- android 实现音量调节
- Android实现音量调节的方法
- 【Android】Android实现视频播放的时候滑动屏幕调节亮度和音量
- WINCE音量调节的实现
- WINCE音量调节的实现
- WINCE音量调节的实现
- WINCE音量调节的实现
- Android通过按钮和进度条实现音量调节(AudioManager)
- 【Android界面实现】自定义音量调节控件的实现
- Android里的音量调节
- android 的 c层 实现 音乐播放与音量调节
- 银行离开IBM必死?国货10年内无法接盘
- Android的framework层音量控制原理分析
- Java高效开发框架Nutz开发成员专访
- 雅虎Flickr将拒用Google及Facebook帐号登入
- "redirect:/news/to"; springmvc的方式通过后台来进行重定向目录
- Android音量调节的实现(RingtoneManager和RingerVolumePreference)
- linux调试不是按照顺序执行指令
- DYNAMIC_DOWNCAST
- 观察者模式
- 实现springmvc 的controller级别的跳转的方法 return "redirect:/news/to";
- cisco(思科)交换机全局配置篇——交换机登录等【三】
- php中使用mysql需要注意
- JFinal初始化
- Ubuntu下iptux