android音频系统(6):AudioService之音频输出通道切换

Android Audio(五)—— AudioService AudioService 1. 类图 2. 启动流程 3. 构造函数 public AudioService(Context context) { mContext = context; mContentResolver = context.getContentResolver(); mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE); . 阅读详情
AI摘要

本文详细探讨了Android系统中音频输出通道、播放模式及流类型的管理机制,包括如何通过AudioService控制音频输出设备,如扬声器和蓝牙耳机,并解析了不同音频模式下设备切换的策略。

前言:音频输出的方式有很多种,外放即扬声器(Speaker)、听筒(Telephone Receiver)、有线耳机(WiredHeadset)、蓝牙音箱(Bluetooth A2DP)等,电话免提、插拔耳机、连接断开蓝牙设备等操作系统都会自动切换Audio音频到相应的输出设备上。

我们知道,音频输出通道切换有些是系统自动切换的,但是有些自动切换并不是我们想要的,如:音乐App在听歌时,需要对听歌时拔出耳机的操作进行阻止(暂停播放)而不是突然切换到外放,又如通话时插入耳机并按下免提,希望声音既可以从耳机输出,又可以从扬声器输出;

我们可以不用系统的自动切换,而自己设置音频输出通道的切换吗?

答案是可以的,即可以在应用层修改,也可以在Framework修改,今天讲的就是Framework层的修改,也就是修改AudioService;

 

1.先看下android中有哪些音频输出通道,常用的加了注释:

AudioSystem.java
public static final int FORCE_NONE = 0;//默认通道
public static final int FORCE_SPEAKER = 1;//扬声器通道
public static final int FORCE_HEADPHONES = 2;//耳机通道
//下面两个是蓝牙耳机通道
public static final int FORCE_BT_SCO = 3;//是一种双向的音频数据的传输链路,只能用于普通语音的传输,不能用于播放音乐
public static final int FORCE_BT_A2DP = 4;//是一种单向的高品质音频数据传输链路,通常用于播放立体声音乐
public static final int FORCE_WIRED_ACCESSORY = 5;//有线设备通道,如有线耳机
public static final int FORCE_BT_CAR_DOCK = 6;
public static final int FORCE_BT_DESK_DOCK = 7;
public static final int FORCE_ANALOG_DOCK = 8;
public static final int FORCE_DIGITAL_DOCK = 9;
public static final int FORCE_NO_BT_A2DP = 10;
public static final int FORCE_SYSTEM_ENFORCED = 11;
public static final int FORCE_HDMI_SYSTEM_AUDIO_ENFORCED = 12;
public static final int FORCE_ENCODED_SURROUND_NEVER = 13;
public static final int FORCE_ENCODED_SURROUND_ALWAYS = 14;
public static final int NUM_FORCE_CONFIG = 15;
public static final int FORCE_DEFAULT = FORCE_NONE;

常用的也就是:扬声器,有线耳机,听筒,蓝牙耳机等;

 

2.播放模式

在使用音频输出通道时,需要指定播放模式:

AudioSystem.java
/* modes for setPhoneState, must match AudioSystem.h audio_mode */
public static final int MODE_INVALID            = -2;
public static final int MODE_CURRENT            = -1;
public static final int MODE_NORMAL             = 0;//待机模式,既不是铃声模式也不是通话模式,如music
public static final int MODE_RINGTONE           = 1;//铃声模式
public static final int MODE_IN_CALL            = 2;//音频通话模式
public static final int MODE_IN_COMMUNICATION   = 3;//通信模式,包括音/视频,VoIP通话.(3.0加入的,与通话模式类似)
public static final int NUM_MODES               = 4;

我们指定音频播放模式时,会通知HAL,我们当前音频所处于的状态,以便可以适当地传送音频。

 

3.流类型

设置播放模式的时候,需要考虑流类型,常用的流类型有:

/** Used to identify the default audio stream volume */
public static final int STREAM_DEFAULT = -1;
/** Used to identify the volume of audio streams for phone calls */
public static final int STREAM_VOICE_CALL = 0;
/** Used to identify the volume of audio streams for system sounds */
public static final int STREAM_SYSTEM = 1;
/** Used to identify the volume of audio streams for the phone ring and message alerts */
public static final int STREAM_RING = 2;
/** Used to identify the volume of audio streams for music playback */
public static final int STREAM_MUSIC = 3;
/** Used to i
Android 15车载音频调试实战:音区、焦点与路由问题排查指南 智能座舱音频系统涉及Android底层音频框架与车载硬件策略的复杂协同,其中AudioService、CarAudioService与AudioPolicy共同构成了音频路由与焦点仲裁的核心链路。在车载场景下,音区映射决定了不同座位的声音输出,焦点管理则直接影响导航、通话与媒体播放的优先级,而策略路由的配置正确性关乎A2DP、投屏及外部功放等设备的音频送达。理解这些基础原理,是高效定位无声、杂音、焦点抢占等高频问题的前提。随着Android版本升级,原有的调试命令和输出格式可能发生变化,需要掌握基于dump 阅读详情

相关推荐

Android 15车载音频调试全指南:从路由到投屏故障排查实战

音频调试是Android系统开发中极具挑战性的环节,尤其在车载场景下,音频焦点、音量曲线与路由策略交织成一张复杂的网。Android 15在音频架构上延续了既有框架,却在AudioAttributes映射、CarAudioZone校验及音频镜像路径等细节上带来诸多行为变化,导致许多旧版调试套路不再适用。掌握音频路由基础原理与HAL层验证方法,是快速定位导航无声、蓝牙音乐异常等问题的关键。同时,Android 15投屏失败的根因往往不在视频链路,而是音频补丁创建失败引发会话回滚。从dumpsys日志分析到ti

weixin_34212762的博客 188

Android车载音频配置文件car_audio_configuration.xml深度解析

Android音频子系统是移动与车载平台的核心多媒体基础设施,其核心在于策略驱动的音频路由与硬件抽象分离。在车载场景中,传统手机级音频配置无法满足多区扬声器、ANC通道、主驾/副驾独立控制等需求,因此Android Automotive引入car_audio_configuration.xml作为硬件拓扑定义的关键配置。该文件通过zone分区、device物理地址映射、volume_group分组调控及routing_rules硬编码路由,实现声学空间建模与确定性音频调度。它不是应用层API,而是Audio

weixin_34326179的博客 604

Android音频通路切换:从原理到实战的完整指南

音频通路(Audio Routing)是Android音频系统中决定声音从应用输出到物理设备(如扬声器、耳机、蓝牙设备)路径的核心机制。其原理基于Android分层音频框架,应用层通过AudioManager等API与底层的AudioPolicyService交互,由后者根据设备连接状态、音频流类型和策略决定最终路由。这项技术的价值在于确保音频播放符合用户预期和设备场景,例如在插入耳机时自动切换输出、在蓝牙车载系统连接时导航语音优先。在应用场景上,它广泛用于语音通话、媒体播放、导航提示和在线K歌等需要精确控

weixin_33742618的博客 412

Android Audio基础——系统服务(二)

AudioService 继承自 IAudioService.Stub。IAudioService.Stub 类很明显是通过 IAudioService.aidl 自动生成的。AudioService 位于 Binder Native 端。AudioManager 拥有 AudioService 的 Binder Proxy 端,是 AudioService 在客户端的一个代理。几乎所有客户端对 AudioManager 进行的请求,最终都会交由 AudioService 实现。

小旭的专栏 2075

Android12 获取音频输出列表&设置音频输出通道

有个需求是APP端能够获取所有音频输出列表,研究了很长时间源码,发现只有这个API合适。这个API能够获取到设备上所有可用的输出,且APP可以调用。

guanmingyuangmy的博客 4036

基于python的排课表系统,用python编写排课系统

实现一个具体的课程管理系统。(5) 学生可以查看自己选上的课的成绩,以及各个课程的得分、绩点,并给出其平均绩点,但不允许查看年级其他人的成绩。(2) 学生定制专属课表,可以查看整个学期本人的课程安排,包括课程名称、上课时间、上课地点、任课老师、学分等等。(13) 系主任可以查看整个系的全部学生以及他们的平均绩点,可以对每个班进行排名,或者也可以对整个系进行排名。(15) 系主任可以查看整个学期所开设的所有课程,包括这些课程的全部详细信息。(1) 学生基本信息的查询,学生可以对本人的系统登陆密码进行修改。

yang0728y的博客 2000

Mplus—交叉滞后面板模型(Cross-Lagged Panel Model, CLPM)

本文介绍交叉滞后模型相关知识,以及显变量模型与潜变量模型在Mplus中的语法。

m0_54401011的博客 1万+

PaddleOCR全版本完整指南:从入门到精通,全面解析安装部署与高级应用

摘要 本文详细介绍了PaddleOCR的完整安装与使用指南。首先讲解了环境准备步骤,包括Python 3.11虚拟环境创建和PaddlePaddle框架的CPU/GPU版本安装。接着介绍了PaddleOCR库的安装方式,可选功能模块(文档解析、信息抽取、翻译等)及其依赖组。通过示例代码演示了PPStructureV3文档解析功能的基本用法,并提供了安装验证方法。最后针对常见问题(Windows中文用户名报错、模型下载问题)给出解决方案。文章为从入门到精通的PaddleOCR用户提供了全面的技术指导。

算法工程师 1367

【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知

Docker的监控,可以使用Docker自带的stats命令来获取当前主机上运行中的容器的资源使用情况。 例如:容器的CPU使用率、内存占用、网络IO以及磁盘IO等指标。

景天科技苑 6万+

单反相机物镜设计[DG-10]

REAR(要打在像面,操作数要找像面对应位置15):以透镜单位表示的真实光线径向坐标,波长由Wave定义,参见“Hx、Hy、Px和Py”。最小玻璃厚度最小不能小于semi-dia的1/10,要根据layout看有没有过厚过薄,反复调节。PROD:两个操作数的乘积(操作#1 X操作#2)。3x4就是57.3x0.41=23.5。拦光一般在第一面和最后一面操作,减少边缘无用光线。光阑面与镜面贴近,要调距离,同时设置光阑像差。后截距是指从镜头后表面到焦点的距离。CONS:弧度转为角度。镜头相互嵌入,有错误。

weixin_72050316的博客 600

开篇词:学习系统分析师的好处?核心考点有哪些?

系统分析师备考指南 系统分析师是IT行业的高级专业人才,具备系统分析与设计能力,能指导开发团队工作。学习系统分析师不仅能获得职业晋升的"黄金跳板",还能全面提升技术架构思维和业务理解能力。 核心价值: 职业发展:晋升管理岗位的硬性要求,突破职业天花板 能力提升:构建T型知识结构,培养架构思维和软技能 市场竞争力:成为"业务+技术"桥梁,获得国家级专业认证 考试内容: 计算机基础知识(硬件、操作系统、网络等) 系统分析专业知识(软件工程、架构设计等) 进阶知识(企业信息

数据知道的博客 5944

CondaHTTPError: HTTP 404 not found for url https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs解决方案

本文主要介绍了CondaHTTPError: HTTP 404 not found for url https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main解决方案,希望能对使用xx的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 17万+

使用YOLOv5进行工业检测(如裂纹、划痕、破损等)

本文将详细介绍如何使用YOLOv5实现工业检测项目,以检测生产线上的缺陷产品,如裂纹、划痕、破损等。我们将分步介绍数据准备、模型训练、模型优化和部署等过程。

a871923942的博客 2528

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: Activity常用知识总结
下一篇: android音频系统(7):通话过程中的音频输出设备切换
renshuguo123723
博客等级 码龄12年 135粉丝 52原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

renshuguo123723

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值