Android音量调节的实现(RingtoneManager和RingerVolumePreference)

news/2024/11/29 23:51:06/

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来实现的。

 

 


http://www.ppmy.cn/news/753516.html

相关文章

Linux 内核源代码情景分析(四)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理 Linux 内核源代码情景分析(一) Linux 内核源代码情景分析(二) Linux 内核源代码情景分析&#xff…

Android开发音效增强中铃声播放Ringtone及声音池调度SoundPool的讲解及实战(超详细 附源码)

需要源码请点赞关注收藏后评论区留下QQ~~~ 一、铃声播放 虽然媒体播放器MediaPlayer既可用来播放视频,也可以用来播放音频,但是在具体的使用场合,MediaPlayer存在某些播音方面的不足之处 包括以下几点 1:初始化比较消耗资源 尤其…

2021 红米6A MIUI11稳定版刷开发版 方法

1.下载红米 6A (cactus) 开发版(公测)刷机包 MIUI10 9.9.3 2.开发者中解锁BL 3.将开发版(公测)刷机包放到手机中 4.直接选择刷机包进行更新 一定要先解锁BL再刷,否则会验证不通过。

小米6android0root,小米 红米6 pro(安卓9.0)获取Root权限服务含精简系统方案

安卓手机一旦获取Root权限就好像拥有了全世界 独家系统精简方案,优化系统流畅度,还你如初的感受。 刷前须知: 使用本服务前,请保证手机未进行刷机或root权限 使用本服务不会清除手机数据,但建议备份数据后使用 请保证刷…

小米红米6Pro线刷兼救砖_解账户锁_纯净刷机包_教程

* 确保你的手机已经解BL锁了,如果没有解BL锁的话 查看教程 * 手机先关机,并且手机先不要用数据线连接电脑,先断开数据线。 一:下载刷机包并解压 解账户锁刷机包下载 远程刷机 二:打开rom文件夹里找到《Fastb…

小米 红米6 线刷兼救砖_解账户锁_纯净刷机包_教程

* 确保你的手机已经解BL锁了,如果没有解BL锁的话 查看教程 * 手机先关机,并且手机先不要用数据线连接电脑,先断开数据线。 一:下载刷机包并解压 解账户锁刷机包下载 远程刷机 二:打开rom文件夹里找到《Fastb…

小米 红米6A 线刷兼救砖_解账户锁_纯净刷机包_教程

* 确保你的手机已经解BL锁了,如果没有解BL锁的话 查看教程 * 手机先关机,并且手机先不要用数据线连接电脑,先断开数据线。 一:下载刷机包并解压 解账户锁刷机包下载 远程刷机 二:打开rom文件夹里找到《Fastb…

linux_driver_day04

作业1 题目&#xff1a; 编写LED灯的驱动&#xff0c;创建三个设备文件&#xff0c;每个设备文件和一个LED灯绑定&#xff0c;当操作这个设备文件时只能控制设备文件对应的这盏灯。 代码&#xff1a; main.c #include "head.h" #include <fcntl.h> #inclu…