`
bcyy
  • 浏览: 1830025 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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输出通道切换的典型场景—— 用耳机听音乐时,拔出耳机

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





图中:

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

分享到:
评论

相关推荐

    Android 距离感应控制Audio输出通道

    * 切换扬声器播放声音 or 听筒播放 * 1. 距离感应器:继承SensorEventListener这个监听,重写onSensorChanged方法 * 2. 检测耳机插入和拔出:HeadsetPlugReceiver监听广播AudioManager.ACTION_AUDIO_BECOMING_...

    Android 12 AudioFlinger 分析(RK3588)

    Android 12 AudioFlinger 分析(RK3588)

    Android 蓝牙 A2DP播放AVDTP连接,音乐从audio到A2dp蓝牙侧,流程图。

    Android 蓝牙 A2DP播放AVDTP连接,音乐从audio到A2dp蓝牙侧,流程图。非常详细的从btif-bta-btm-hci 数据流程走向,以及从controller收到数据到btm层,将Android 源码使用流程图的形式画了出来,使Android 蓝牙...

    Android 蓝牙 Audio音频输出通道切换详解_卡音,多年安卓开发经验,从实际项目中获取到的经验,对安卓开发者非常有帮助。

    Android 蓝牙 Audio音频输出通道切换详解_卡音,多年安卓开发经验,从实际项目中获取到的经验,对安卓开发者非常有帮助。

    android安卓切换听筒-外放-蓝牙耳机设备

    android安卓切换听筒-外放-蓝牙耳机设备

    android9.0ble补丁蓝牙语音遥控器支持补丁.rar

    在Android框架层上就通过配置文件将ble hal导入到音频框架中,并通过绑定Android原生已有的耳麦设备来完成audio音频策略选择,通过apk检测ble连接状态,通知audio服务耳麦设备的状态就可以使得录音通路切换至ble hal...

    android-framework-hal

    7 Android的Audio系统 7.1 Audio系统的综述 Audio系统架构和代码路径 7.2 meida库中Audio相关接口 Audio系统的本地核心接口,类的层次结构 7.3 Audio系统和上层接口 Audio系统的JAVA层次的接口 7.4 Audio...

    深入理解Android:卷I--详细书签版

    第5章讲解了android系统中常用的类,包括sp、wp、refbase、thread等类,同步类,以及java中的handler类和 looper类,掌握这些类的知识后方能在后续的代码分析中做到游刃有余;第6章以mediaserver为切入点,对...

    WebRTC学习之三:录音和播放

    使用WebRTC C++实现的录音与播放功能,界面用的Qt。 详见博客:http://blog.csdn.net/caoshangpa/article/details/53446916

    Basic-Audio-Call:样例应用程序可加入通道,静音,并在扬声器耳机之间切换

    基本音频通话其他语言:Agora提供了一组示例应用程序,展示了如何集成Agora Audio SDK来实现以下目的:支持平台一对一语音通话Android,iOS提供了一对一语音呼叫的示例应用程序。 1对1语音呼叫示例应用程序演示了...

    基于 Android AudioRecord 音频采集与分发(PCM).zip

    多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

    Android 4游戏编程入门经典

     5.3 androidaudio、androidsound和androidmusic  5.4 androidinput和accelerometer-handler  5.4.1 accelerometerhandler:手机哪一面朝上  5.4.2 compasshandler  5.4.3 pool类:重用相当有用  5.4.4 ...

    audio-Android-Audio-Filter

    io-android-audio-comb-filter 该项目由一个简单的 Android 应用程序组成,该应用程序实现了可变阶梳状滤波器的算法。 该应用程序从其资源中读取一个简短的 WAV 文件,对其进行复制和过滤,使用切换按钮打开或关闭...

    Flutter_MusicPlayer

    audioplayers:用于在应用程序中播放音频 还添加了Flutter Icon。 笔记 对于此项目,我们必须迁移到AndroidX链接: ://medium.com/@carlosAmillan/fixing-androidx-error-in-flutter-f35e18d5925 从Andriod Studio...

    RK音频简介以及常见问题debug方法

    音频编解码器 Codec 负责处理音频信息,包括 ADC,DAC,Mixer,DSP,输入输出以及音量控制等所有 与音频相关的功能。 Codec 与处理器之间通过 I2C 总线和数字音频接口 DAI 进行通信。

    《深入理解Android》卷Ⅰ

    2.4.8 JNI中的异常处理 2.5 本章小结 第3章 深入理解init 3.1 概述 3.2 init分析 3.2.1 解析配置文件 3.2.2 解析service 3.2.3 init控制service 3.2.4 属性服务 3.3 本章小结 第4章 深入理解zygote 4.1 概述 4.2 ...

    android游戏编程入门

     5.3 AndroidAudio、AndroidSound  和AndroidMusic 147  5.4 AndroidInput和Accelerometer-  Handler 152  5.4.1 AccelerometerHandler:手机  哪一面朝上 152  5.4.2 CompassHandler 153  5.4.3 Pool类:...

    深入理解Android卷1全

    深入理解Android 卷1 不是扫描版的,是全版电子书的,非PDF,可编辑,各种阅览器以打开!包括书签和同步目录! 第1章 阅读前的准备工作 / 1 1.1 系统架构 / 2 1.1.1 Android系统架构 / 2 1.1.2 本书的架构 / 3 1.2 ...

    UMP Pro (Win, Mac, Linux, WebGL) v2.0.3

    UMP 是一个适用于 Unity 的通用媒体框架插件,基于 Video LAN Codec (libVLC) 原生库。 ...+ 支持主要视频播放器功能,如:播放、暂停、静音、播放速率、倒回、快照、(SRT) 字幕、切换音频输出等…

Global site tag (gtag.js) - Google Analytics