1.Android音量键调节音量流程
整个流程分析是基于Android 8.0来进行讲解的
2.Android流定义
在Android系统中,音量都是分开控制的,比如媒体音量,铃声音量,闹钟音量,蓝牙音量,通话音量都是分开控制的。各种音量都是通过音频流来区别不同音量类型的。在Android 8.0里面,一共定义了11种流的类型,每种流类型都定义了最大音量(MAX_STREAM_VOLUME),最小音量(MIN_STREAM_VOLUME),以及默认音量(DEFAULT_STREAM_VOLUME),细心的童鞋可能会发现,我们能调节的音量类型,也就5种。所以还存在一个流的映射关系,然后这个流就可以使用另外一个流的音量了。
- 最大音量
-frameworks/base/services/core/java/com/android/server/audio/AudioService.java
/** Maximum volume index values for audio streams */
private 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
};
复制代码
- 最小音量
-frameworks/base/services/core/java/com/android/server/audio/AudioService.java
/** Minimum volume index values for audio streams */
private static int[] MIN_STREAM_VOLUME = new int[] {
1, // STREAM_VOICE_CALL
0, // STREAM_SYSTEM
0, // STREAM_RING
0, // STREAM_MUSIC
0, // STREAM_ALARM
0, // STREAM_NOTIFICATION
0, // STREAM_BLUETOOTH_SCO
0, // STREAM_SYSTEM_ENFORCED
0, // STREAM_DTMF
0, // STREAM_TTS
0 // STREAM_ACCESSIBILITY
};
复制代码
- 默认音量
-frameworks/base/media/java/android/media/AudioSystem.java
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
};
复制代码
-
音频流映射 在Android系统中,不同设备的映射不尽相同,一共定义了三种设备的音频流的映射,分别是VOICE(STREAM_VOLUME_ALIAS_VOICE),TELEVISION(STREAM_VOLUME_ALIAS_TELEVISION),DEFAULT(STREAM_VOLUME_ALIAS_DEFAULT)。
- VOICE(STREAM_VOLUME_ALIAS_VOICE),voice表示具有语音功能的设备,比如电话
-frameworks/base/services/core/java/com/android/server/audio/AudioService.java private final int[] STREAM_VOLUME_ALIAS_VOICE = new int[] { AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL AudioSystem.STREAM_RING, // STREAM_SYSTEM AudioSystem.STREAM_RING, // STREAM_RING AudioSystem.STREAM_MUSIC, // STREAM_MUSIC AudioSystem.STREAM_ALARM, // STREAM_ALARM AudioSystem.STREAM_RING, // STREAM_NOTIFICATION AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO AudioSystem.STREAM_RING, // STREAM_SYSTEM_ENFORCED AudioSystem.STREAM_RING, // STREAM_DTMF AudioSystem.STREAM_MUSIC, // STREAM_TTS AudioSystem.STREAM_MUSIC // STREAM_ACCESSIBILITY }; 复制代码
- TELEVISION(STREAM_VOLUME_ALIAS_TELEVISION),television对应电视或者机顶盒
-frameworks/base/services/core/java/com/android/server/audio/AudioService.java private final int[] STREAM_VOLUME_ALIAS_TELEVISION = new int[] { AudioSystem.STREAM_MUSIC, // STREAM_VOICE_CALL AudioSystem.STREAM_MUSIC, // STREAM_SYSTEM AudioSystem.STREAM_MUSIC, // STREAM_RING AudioSystem.STREAM_MUSIC, // STREAM_MUSIC AudioSystem.STREAM_MUSIC, // STREAM_ALARM AudioSystem.STREAM_MUSIC, // STREAM_NOTIFICATION AudioSystem.STREAM_MUSIC, // STREAM_BLUETOOTH_SCO AudioSystem.STREAM_MUSIC, // STREAM_SYSTEM_ENFORCED AudioSystem.STREAM_MUSIC, // STREAM_DTMF AudioSystem.STREAM_MUSIC, // STREAM_TTS AudioSystem.STREAM_MUSIC // STREAM_ACCESSIBILITY }; 复制代码
- DEFAULT(STREAM_VOLUME_ALIAS_DEFAULT),default表示平板之类的设备
-frameworks/base/services/core/java/com/android/server/audio/AudioService.java private final int[] STREAM_VOLUME_ALIAS_DEFAULT = new int[] { AudioSystem.STREAM_VOICE_CALL, // STREAM_VOICE_CALL AudioSystem.STREAM_RING, // STREAM_SYSTEM AudioSystem.STREAM_RING, // STREAM_RING AudioSystem.STREAM_MUSIC, // STREAM_MUSIC AudioSystem.STREAM_ALARM, // STREAM_ALARM AudioSystem.STREAM_RING, // STREAM_NOTIFICATION AudioSystem.STREAM_BLUETOOTH_SCO, // STREAM_BLUETOOTH_SCO AudioSystem.STREAM_RING, // STREAM_SYSTEM_ENFORCED AudioSystem.STREAM_RING, // STREAM_DTMF AudioSystem.STREAM_MUSIC, // STREAM_TTS AudioSystem.STREAM_MUSIC // STREAM_ACCESSIBILITY }; 复制代码
- 映射关系如下
流序号 流类型 最大音量 最小音量 默认音量 VOICE/DEFAULT TELEVISION 0 STREAM_VOICE_CALL 5 1 4 STREAM_VOICE_CALL STREAM_MUSIC 1 STREAM_SYSTEM 7 0 7 STREAM_RING STREAM_MUSIC 2 STREAM_RING 7 0 5 STREAM_RING STREAM_MUSIC 3 STREAM_MUSIC 15 0 5 STREAM_MUSIC STREAM_MUSIC 4 STREAM_ALARM 7 0 6 STREAM_ALARM STREAM_MUSIC 5 STREAM_NOTIFICATION 7 0 5 STREAM_RING STREAM_MUSIC 6 STREAM_BLUETOOTH_SCO 15 0 7 STREAM_BLUETOOTH_SCO STREAM_MUSIC 7 STREAM_SYSTEM_ENFORCED 7 0 7 STREAM_RING STREAM_MUSIC 8 STREAM_DTMF 15 0 5 STREAM_RING STREAM_MUSIC 9 STREAM_TTS 15 0 5 STREAM_MUSIC STREAM_MUSIC 10 STREAM_ACCESSIBILITY 15 0 5 STREAM_MUSIC STREAM_MUSIC 通过上表,可以很明显的看到,在手机和平板上面