Android中的Audio播放:控制Audio输出通道切换

分类:android 170人阅读 评论(0) 收藏 举报

Audio 输出通道有很多,Speaker、headset、bluetooth A2DP等。通话或播放音乐等使用Audio输出过程中,可能发生Audio输出通道的切换。比如,插入有线耳机播放音乐时,声音是从耳机发出的;而此时拔出耳机,Audio输出通道会发生切换。如果音乐播放器不做处理,Audio输出是被切换到扬声器的,声音直接从Speaker发出。我们在编写程序时,要捕获并按照需求来处理这样的事,本文就是讲解如何处理的。

Android中可以通过android.media.AudioManager查询当前Audio输出的情况,并且在Audio输出发生变化时,捕获并处理这种变化。


一、Audio输出状态查询与控制

android.media.AudioManager提供的下列方法可以用来查询当前Audio输出的状态:

  • isBluetoothA2dpOn():检查A2DPAudio是否通过蓝牙耳机;
  • isSpeakerphoneOn():检查扬声器是否打开;
  • isWiredHeadsetOn():检查线控耳机是否连着;注意这个方法只是用来判断耳机是否是插入状态,并不能用它的结果来判定当前的Audio是通过耳机输出的,这还依赖于其他条件。

另外还有一些设置这些Audio输出的setXYZ()方法,这些方法在一般使用Audio输出的应用程序不要直接调用,他们由系统来管理,实现Audio输出通道的自动切换。除非,界面提供给用户切换的菜单或按钮,而用户选择了却换,比如要直接选择扬声器发声,可直接调用setSpeakerphoneOn()。

二、Audio输出通道切换的事件的捕获与处理

因为耳机插拔、蓝牙耳机的断开,Audio输出通路会自动切换。此时正在播放Audio的程序要获得通知,知道这一事件的发生。Android中是通过广播ACTION_AUDIO_BECOMING_NOISY这个Intent通知的。

处理广播的较好的方式,是动态注册/注销自己所关心的广播。下面代码演示了,开始播放时注册广播的Receiver;停止播放时注销广播的Receiver。对Audio输出通道切换的处理是暂停当前的播放,不直接从新的通道里发出声来。

                                    
  1. privateclassNoisyAudioStreamReceiverextendsBroadcastReceiver{
  2. @Override
  3. publicvoidonReceive(Contextcontext,Intentintent){
  4. if(AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())){
  5. //Pausetheplayback
  6. }
  7. }
  8. }
  9. privateIntentFilterintentFilter=newIntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
  10. privatevoidstartPlayback(){
  11. registerReceiver(myNoisyAudioStreamReceiver(),intentFilter);
  12. }
  13. privatevoidstopPlayback(){
  14. unregisterReceiver(myNoisyAudioStreamReceiver);
  15. }


三、Audio输出通道切换的典型场景—— 用耳机听音乐时,拔出耳机

听耳机听音乐时,耳机别拔出的时序图如下:



Android中的Audio播放:控制Audio输出通道切换_第1张图片


图中:

  • AudioNoisy Client注册了侦听广播AudioManager.ACTION_AUDIO_BECOMING_NOISY[Step#1 ~ #2];
  • 用耳机一直在听音乐;
  • HeadsetObserver一直在监视耳机状态的变化。检测到耳机被拔出之后,发出广播AudioManager.ACTION_AUDIO_BECOMING_NOISY[Step#3~4];
  • AudioNoisy Client收到了广播,发送暂停命令给MediaPaybackService去暂停当前的播放 [Step#5~6]。

更多相关文章

  1. android switch模块 (耳机检测)
  2. Android开启关闭手机扬声器
  3. Android 耳机插入过程分析
  4. Android 监听耳机外放设备
  5. Android耳机按键监听
  6. Android 程序获取、设置铃声、音量、静音、扬声器
  7. android下TTS的传感器切换听筒和扬声器测试
  8. Android 蓝牙( Bluetooth)耳机连接分析及实现

随机推荐

  1. Oracle 定义者权限与调用者权限(AUTHID CU
  2. 【DB笔试面试591】在Oracle中,什么是星型
  3. 【DB笔试面试601】在Oracle中,给出下面执
  4. Oracle的簇与簇表
  5. 【DB笔试面试765】在Oracle中,什么是OGG?它
  6. 【DB笔试面试728】在Oracle中,如何修改RAC
  7. oracle 从执行计划的预估行数看执行计划
  8. Oracle分批提交DML
  9. 在Oracle中,如何定时删除归档日志文件?
  10. Citrix MCS桌面模板更新