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

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

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

AudioNoisy AudioManager


一、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. private class NoisyAudioStreamReceiver extends BroadcastReceiver {  
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {  
  5.             // Pause the playback   
  6.         }  
  7.     }  
  8. }  
  9.   
  10. private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);  
  11.   
  12. private void startPlayback() {  
  13.     registerReceiver(myNoisyAudioStreamReceiver(), intentFilter);  
  14. }  
  15.   
  16. private void stopPlayback() {  
  17.     unregisterReceiver(myNoisyAudioStreamReceiver);  
  18. }  
private class NoisyAudioStreamReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
            // Pause the playback
        }
    }
}

private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);

private void startPlayback() {
    registerReceiver(myNoisyAudioStreamReceiver(), intentFilter);
}

private void stopPlayback() {
    unregisterReceiver(myNoisyAudioStreamReceiver);
}

 

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

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

AudioNoisy_Sequence.jpg

图中:

  •  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]。

 

小结

        Audio 输出通道切换时,要根据具体需求来做相应的处理。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将Android设备的音频切换到蓝牙耳机,可以按照以下步骤进行操作: 首先,确保蓝牙耳机已经与Android设备成功配对。在设备的设置菜单,找到“蓝牙”选项,并打开蓝牙功能。在配对列表选择你的蓝牙耳机,并进行配对。 一旦蓝牙耳机成功连接,可以采取以下两种方法将音频切换到蓝牙耳机: 方法一:在通知面板切换音频输出。下滑打开通知面板,在音频控制,通常会显示设备当前正在使用的音频输出设备。点击该设备图标,会弹出一个菜单,其列出了所有可用的音频输出选项,包择轨蓝牙耳机作为当前音频输出设备。 方法二:在设置菜单切换音频输出。进入设备的设置菜单,在“声音和振动”或类似的选项下,找到“音频输出”或“音频设备”选项。点击该选项,会列出所有可用的音频输出设备,包括蓝牙耳机。选择蓝牙耳机作为当前音频输出设备。 一旦成功切换音频输出到蓝牙耳机Android设备的所有音频输出,包括音乐、视频和通话声音,都会通过蓝牙耳机进行播放。如果将蓝牙耳机关闭或与设备断开连接,音频输出将自动切换回设备的内置扬声器。 总结来说,要将Android设备的音频切换到蓝牙耳机,需要确保设备和蓝牙耳机成功配对。然后,在通知面板或设置菜单选择蓝牙耳机作为音频输出设备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值