【发布时间】:2014-08-30 10:10:18
【问题描述】:
AudioManager 中有几种流类型。它们在低层次上有何不同?会不会是例如的用法? AudioManager.STREAM_MUSIC 阻止输入麦克风流?还是别的什么?
【问题讨论】:
标签: android android-audiomanager
AudioManager 中有几种流类型。它们在低层次上有何不同?会不会是例如的用法? AudioManager.STREAM_MUSIC 阻止输入麦克风流?还是别的什么?
【问题讨论】:
标签: android android-audiomanager
一个最显着的区别是音量控制。
正如document 所说,我们可以分别为每个流设置音量级别或调整音量。
我们可以控制"Audio Focus",让其他应用程序停止播放或降低音量,这样我们就可以在特定的流上清晰地播放声音,或者声音不会阻挡其他高优先级的声音,如电话铃声、导航语音反馈等像这样。
由于多个应用可能会播放音频,因此考虑它们应该如何交互非常重要。为避免所有音乐应用同时播放,Android 使用音频焦点来调节音频播放——只有拥有音频焦点的应用才能播放音频。
其他未提及的事情是哪个音频设备会发出声音。
使用 STREAM_MUSIC,声音将通过连接到手机的一个音频设备(手机扬声器、耳机、蓝牙扬声器或其他东西)产生。
使用 STREAM_RING 声音将通过连接到手机的所有音频设备产生。
这种行为可能因设备而异。
【讨论】:
像往常一样,无论您在 Google 中没有记录的内容(有时)都可以从代码中理解
至于阻塞,实际上并不是流相互阻塞,只是模式阻塞了事物。 MODE_IN_COMMUNICATION 会阻止大部分流。
闪避: 播放长时间运行的流(例如 MUSIC)时,一种常见且“礼貌”的行为是收听音频焦点回调并在“可以躲避”事件时手动降低流的音量。当焦点返回到您的流时,音量应该会恢复到之前的水平。
流类型会影响流在给定时间对所有声音总和的贡献的音量:
/** @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
AudioService.java 中的这个数组显示给定流的默认最大音量。其他代码:
private void readPersistedSettings() {
final ContentResolver cr = mContentResolver;
mRingerMode = System.getInt(cr, System.MODE_RINGER, AudioManager.RINGER_MODE_NORMAL);
mVibrateSetting = System.getInt(cr, System.VIBRATE_ON, 0);
mRingerModeAffectedStreams = Settings.System.getInt(cr,
Settings.System.MODE_RINGER_STREAMS_AFFECTED,
((1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_NOTIFICATION)|
(1 << AudioSystem.STREAM_SYSTEM)|(1 << AudioSystem.STREAM_SYSTEM_ENFORCED)));
mMuteAffectedStreams = System.getInt(cr,
System.MUTE_STREAMS_AFFECTED,
((1 << AudioSystem.STREAM_MUSIC)|(1 << AudioSystem.STREAM_RING)|(1 << AudioSystem.STREAM_SYSTEM)));
mNotificationsUseRingVolume = System.getInt(cr,
Settings.System.NOTIFICATIONS_USE_RING_VOLUME, 1);
似乎表明当手机开始“响铃”或通话进行时,哪些流被静音或音量降低。
【讨论】:
STREAM_ALARM The audio stream for alarms
STREAM_DTMF The audio stream for DTMF Tones
STREAM_MUSIC The audio stream for music playback
STREAM_NOTIFICATION The audio stream for notifications
STREAM_RING The audio stream for the phone ring
STREAM_SYSTEM The audio stream for system sounds
STREAM_VOICE_CALL The audio stream for phone calls
来自http://developer.android.com/reference/android/media/AudioManager.html
【讨论】: