Android使用AudioManager切换到听筒模式
经过几个阶段的开发,神马笔记已经实现了录音和播放录音的功能。
目前音频输出设备都是手机的扬声器,如果是在公共场合,又没有耳机,使用扬声器就不是特别方便。
因此,需要切换到听筒输出。
一、目标
将音频切换到听筒输出。
二、参考资料
1. 相关的功能类
功能类 | 描述 |
---|---|
AudioManager | 音频管理类,提供了音频管理的所有接口。 |
BroadcastReceiver | 获取音频设备变化事件。 |
2. 参考文章
文章 | 说明 |
---|---|
Android监听靠近听筒,音频播放切换听筒和外放 | 实用 |
android播放语音,切换听筒模式遇到的问题 | |
Android5.0版本之后切换听筒模式 | |
关于Android音频焦点的简单实现 | |
《Android优化专题》——音频播放 |
三、测试结果
测试设备:荣耀畅玩7
MODE_RINGTONE
与MODE_NORMAL
测试结果完全一致。
系统会根据当前连接的音频输出设备,决定Speakerphone
最终的输出设备。
Speakerphone
是逻辑设备,并不是最终的物理设备。
最终的物理设备根据设备连接情况以及所设置的模式而决定,可能是
- 手机听筒
- 手机扬声器
- 有线耳机
- 蓝牙音箱
1. 手机
Mode | SpeakerphoneOn | 结果 |
---|---|---|
MODE_IN_COMMUNICATION | true | 手机扬声器 |
false | 手机听筒 | |
MODE_NORMAL | true | 手机扬声器 |
false | 手机扬声器 |
2. 有线耳机
Mode | SpeakerphoneOn | 结果 |
---|---|---|
MODE_IN_COMMUNICATION | true | 手机扬声器 |
false | 有线耳机 | |
MODE_NORMAL | true | 有线耳机 |
false | 有线耳机 |
3. 蓝牙音箱
Mode | SpeakerphoneOn | 结果 |
---|---|---|
MODE_IN_COMMUNICATION | true | 手机扬声器 |
false | 手机听筒 | |
MODE_NORMAL | true | 蓝牙音箱 |
false | 蓝牙音箱 |
4. 有线耳机+蓝牙音箱
测试结果与有线耳机一致,音频优先输出到有线耳机上。
四、实现代码
public class AudioHelper {
private static final String TAG = "AudioHelper";
public static final int TYPE_RECEIVER = 1;
public static final int TYPE_SPEAKER = 2;
AudioManager audioManager;
HeadsetPlugReceiver headsetPlugReceiver;
BiConsumer<AudioHelper, Integer> headsetPlugListener;
NoisyAudioStreamReceiver noisyAudioStreamReceiver;
Consumer<AudioHelper> noisyAudioListener;
FragmentActivity context;
public AudioHelper(FragmentActivity context) {
this.context = context;
this.audioManager = (AudioManager)(context.getSystemService(Context.