Android 蓝牙开发——蓝牙协议配置(七)

news2024/9/20 18:35:31

        蓝牙主要分为两种模式,一种是媒体输出(Source)端,一种是媒体输入(Sink)端。也可以理解为服务端(Server)与客户端(Client)的关系。

        蓝牙配置文件(Bluetooth Profile):是适用于设备间蓝牙通信的无线接口规范。从 Android 3.0 开始,Bluetooth API 便支持使用蓝牙配置文件。举个例子:免提配置文件。如果手机要与无线耳机进行连接,则两台设备都必须支持免提配置文件。

一、蓝牙协议配置文件

1、文件路径

A:手机(Source),配置路径

packages/apps/Bluetooth/res/values/config.xml

B:蓝牙耳机、车载等设备(Sink),配置路径

packages/services/Car/car_product/overlay/packages/apps/Bluetooth/res/values/config.xml

C:高通配置路径

device/qcom/common/product/overlay/packages/apps/Bluetooth/res/values/config.xml

        对于手机这类设备的Android系统中蓝牙协议配置就是 A+C 共同作用的结果,而对于车载设备的 Android 系统中蓝牙协议配置则是 A+B+C 共同作用的结果。

对于手机设备:A<C

对于车载蓝牙设备:A<B<C

2、 overlay介绍

        android overlay 机制允许在不修改 packages 中 apk 的情况下,来自定义 framework 和package 中的资源文件,实现资源的定制。来达到显示不同的 ui 的目的(例如MIUI)。

        原理是在通过AAPT打包成APK时,通过-S命令多增加了一个资源目录(overlay目录),我们平时打包APK只是通过AAPT -S指定了一个资源目录,而Overlay又额外增加了一个资源目录。AAPT -S命令可以指定多个资源目录,overlay的资源将替换原res中的重名文件。

        同时还需要配置多个 mk 中的变量,这里对 overlay 机制就不做过多介绍,只需要知道他是一个资源覆盖的机制就可以了。这道了这些对于上面的路径就可以看出来,B、C 中 overlay 后面所覆盖的路径都是 A(packages/apps/Bluetooth/res/values/config.xml)路径。

参考:Android overlay机制

 二、配置文件解析

1、手机(Source)的配置文件

<resources>
    <!-- 设备的角色(hfp client / hfp server)-->
    <bool name="profile_supported_hs_hfp">true</bool>
    <bool name="profile_supported_hfpclient">false</bool>
    <bool name="profile_supported_hfp_incallservice">true</bool>
    <!-- 蓝牙音频模式(Source or Sink) -->
    <bool name="profile_supported_a2dp">true</bool>
    <bool name="profile_supported_a2dp_sink">false</bool>
    <!-- 文件传输功能 -->
    <bool name="profile_supported_opp">true</bool>
    <!-- 作为Source端,控制手机的声音播放,暂停,音量大小等功能 -->
    <bool name="profile_supported_avrcp_target">true</bool>
    <!-- 作为sink端,控制手机的声音播放,暂停,音量大小等功能 -->
    <bool name="profile_supported_avrcp_controller">false</bool>
    
    <bool name="profile_supported_hid_host">true</bool>
    <bool name="profile_supported_pan">true</bool>
    <bool name="profile_supported_pbap">true</bool>
    <bool name="profile_supported_gatt">true</bool>
    <bool name="pbap_include_photos_in_vcard">true</bool>
    <bool name="pbap_use_profile_for_owner_vcard">true</bool>
    <bool name="profile_supported_map">true</bool>
    <bool name="profile_supported_sap">false</bool>
    <bool name="profile_supported_pbapclient">false</bool>
    <bool name="profile_supported_mapmce">false</bool>
    <bool name="profile_supported_hid_device">true</bool>

    <!-- 启用电话策略 -->
    <bool name="enable_phone_policy">true</bool>
</resources>

         上面仅列出 config.xml 的部分代码,根据命名很好理解对应的协议是否启用。

2、车机(Sink)的配置文件

<resources>
    <!-- 禁用源配置文件(通常用于电话) -->
    <bool name="profile_supported_a2dp">false</bool>
    <bool name="profile_supported_avrcp_target">false</bool>
    <bool name="profile_supported_hs_hfp">false</bool>
    <bool name="profile_supported_hid_device">false</bool>
    <bool name="profile_supported_hid_host">false</bool>
    <bool name="profile_supported_pbap">false</bool>
    <bool name="profile_supported_map">false</bool>
    <bool name="profile_supported_hdp">false</bool>
    <bool name="profile_supported_opp">false</bool>
    <bool name="profile_supported_sap">false</bool>
    <bool name="enable_phone_policy">false</bool>

    <!-- 启用接收器配置文件(通常用于CarKitt) -->
    <bool name="profile_supported_hfpclient">true</bool>
    <bool name="hfp_client_connection_service_enabled">true</bool>
    <bool name="profile_supported_avrcp_controller">true</bool>
    <bool name="avrcp_controller_enable_cover_art">true</bool>
    <bool name="profile_supported_a2dp_sink">true</bool>
    <bool name="profile_supported_pbapclient">true</bool>
    <bool name="profile_supported_pan">true</bool>
    <bool name="profile_supported_mapmce">true</bool>
</resources>

        这里是车载设备 config.xml 的全部代码,其中车载设备的 enable_phone_policy 属性必须设置为 false,以免 CarBluetoothService 中的 Automotive 政策冲突与手机默认连接政策冲突,影响车载设备自动重连功能。

3、高通的配置文件

文件路径:device/qcom/common/product/overlay/packages/apps/Bluetooth/res/values/config.xml

device/qcom/:文件夹下对应着很多高通不同型号的配置文件。

common:通用配置文件夹。

overlay:可以看到,这个文件覆盖的是 /packages/apps/Bluetooth/res/values/config.xml 文件。

        高通的这些配置文件,源码中并不存在(device/qcom/ 路径都不存在),都是后续添加的,通过查看 Android 9.0 的项目源码,config.xml 代码如下:

<resources>
    <bool name="profile_supported_avrcp_controller">true</bool>
    <bool name="profile_supported_a2dp_sink">true</bool>
    <bool name="profile_supported_sap">true</bool>
    <bool name="profile_supported_hid_device">false</bool>
    <bool name="profile_supported_ba">true</bool>
</resources>

        同时在 Android 12.0 源码的 /device/amlogic/yukawa/overlay/packages/apps/Bluetooth/res/values/config.xml 中发现蓝牙配置相关信息。代码如下:

<resources>
   <bool name="profile_supported_a2dp">false</bool>
   <bool name="profile_supported_hs_hfp">false</bool>
   <bool name="profile_supported_pbap">false</bool>
   <bool name="profile_supported_map">false</bool>
   <bool name="profile_supported_hdp">false</bool>
   <bool name="profile_supported_opp">false</bool>

   <bool name="profile_supported_hfpclient">false</bool>
   <bool name="hfp_client_connection_service_enabled">false</bool>
   <bool name="profile_supported_pbapclient">false</bool>
   <bool name="profile_supported_pan">false</bool>
   <bool name="profile_supported_mapmce">false</bool>

   <bool name="profile_supported_hid_host">true</bool>
   <bool name="profile_supported_avrcp_target">true</bool>
   <bool name="profile_supported_avrcp_controller">true</bool>
   <bool name="profile_supported_a2dp_sink">true</bool>
</resources>

 通过上面的分析,车载安卓系统常用的蓝牙协议:

信息访问协议:profile_supported_mapmce —— MapClientService

电话免提协议:profile_supported_hfpclient —— HeadsetClientService

电话本访问协议:profile_supported_pbapclient —— PbapClientService

高级音频分发协议:profile_supported_a2dp_sink —— A2dpSinkService

音视频远程控制协议:profile_supported_avrcp_controller —— AvrcpControllerService

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172496.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4-1指令系统-指令格式

文章目录一.指令的基本格式1.结构2.长度3.根据操作数地址码数目分类&#xff08;1&#xff09;零地址指令&#xff08;2&#xff09;一地址指令&#xff08;3&#xff09;二地址指令&#xff08;4&#xff09;三地址指令&#xff08;5&#xff09;四地址指令二.扩展操作码指令格…

Maven学习(二):Maven基础概念

Maven基础概念一、仓库二、坐标三、全局setting与用户setting区别一、仓库 仓库&#xff1a;用于存储资源&#xff0c;包含各种jar包&#xff1b;仓库分类&#xff1a; 本地仓库&#xff1a;自己电脑上的存储仓库&#xff0c;连接远程仓库获取资源&#xff1b;远程仓库&#x…

信息论复习—离散信道及其容量

目录 信道的简介&#xff1a; 信道的分类&#xff1a; 离散无记忆信道&#xff08;DMC&#xff09;模型&#xff1a; 转移概率&#xff1a; 离散无记忆信道的转移矩阵 输出仅与当前的输入有关&#xff1a; 后验概率&#xff1a; 离散无记忆信道的后验概率矩阵 &#xf…

spring-boot-starter-jdbc和mysql-connector-j依赖爆红的解决办法

spring-boot-starter-jdbc和mysql-connector-j依赖爆红的解决办法 目录spring-boot-starter-jdbc和mysql-connector-j依赖爆红的解决办法出现问题之前出现的问题&#xff1a;解决办法&#xff1a;方案一&#xff1a;第一种是继承 spring-boot-starter-parent 然后 依赖覆盖方案…

怎么用Python测网速?

“speedtest-cli” 是一个 Python 的第三方库&#xff0c;它可以用来在命令行中测试网络速度。它使用了 Speedtest.net 的服务器来进行测速&#xff0c;并可以提供下载和上传速度、延迟、丢包率等信息。使用这个库可以很方便地在终端中测试网络速度&#xff0c;而无需在浏览器中…

轻量级代码生成器加测试数据生成器

轻量级代码生成器加测试数据生成器介绍代码生成常用注解基本使用全局控制属性模板文件相关属性模板文件配置模拟数据生成自定义词库索引注意事项从已经存在的表完成映射,生成模板代码使用步骤Gitee项目链接 介绍 本项目是一个轻量级代码生成器,并提供多种方式来完成模拟数据的…

力扣(LeetCode)2299. 强密码检验器 II(C++/Python3)

题目描述 模拟 仅当密码包含强密码的所有特性&#xff0c;它是一个 强 密码。提示我们&#xff0c;遍历密码&#xff0c;维护 444 个标志&#xff0c;标志记录特性。遍历结束&#xff0c;根据标志判断特性。 class Solution { public:bool strongPasswordCheckerII(string pa…

MySQL建立数据库时字符集和排序规则的选择

文章目录前言一、字符集&#xff1f;二、Mysql中的字符集1.Unicode与UTF8、UTF8MB4、UTF16、UTF32关系2.Mysql新建数据库时选择哪种字符集呢&#xff1f;三、Mysql排序规则四、Mysql查询字符集和排序规则常用的命令前言 在MySQL中&#xff0c;字符集和排序规则是区分开来的&am…

【ArcGIS 小贴士】Pro VS ArcMap及软件获取

有朋友问我&#xff0c;ArcGIS Pro是不是比ArcMap好用。 我觉得用Pro的感觉&#xff0c;用Pro的感觉比ArcMap Ribbon界面 Pro采用的是Ribbon用户界面&#xff0c;与现在的微软的Office软件相似&#xff0c;功能的组织更加清晰。10.x版本的ArcGIS则是传统的工具条界面 有些朋友…

day42|● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 II 1.代码 class Solution { public:int lastStoneWeightII(vector<int>& stones) {int sum 0;for(int i: stones) {sum i;}int t sum;sum sum /2;vector<int>f(sum 1);for (int i 0; i < stones.size(); i) {for (int j …

【Pytorch基础(2)】张量的索引,切片与维度变换

一、张量的维度索引 张量的索引是从第零维度开始的。让我们来创建一个四维的张量做举例说明&#xff1a;torch.Tensor(2,3,64,64) 此时&#xff0c;这个张量可以表示两张边长为64的正方形彩色图像&#xff0c;具体来说&#xff0c;张量的第零维表示图像的数量&#xff1b;第一…

Apollo星火计划学习笔记——Control 专项讲解(LQR)

文章目录1. 算法相关基础1.1 一阶倒立摆1.2 二自由度车辆横向跟踪偏差模型1.3 车辆横向跟踪偏差模型1.4 车辆横向跟踪偏差倒车模型1.5 轮胎侧偏角与侧偏刚度1.6 LQR 线性二次型问题:2. LQR代码解析2.1 WriteHeaders&#xff08;调试过程中的状态量&#xff09;2.2 LatControlle…

Android APK 瘦身

Android APK 瘦身的几个方法将项目中的图片由png、jpg转为webp格式。如下操作&#xff1a;1.1选中图片或者含有图片的文件夹 右键选择Convert toWebP..1.2根据自身情况选择有损压缩还是无损压缩备注&#xff1a;官网连接&#xff1a;https://developer.android.google.cn/studi…

leetcode-每日一题-强密码检验器II(简单,数学逻辑)

如果一个密码满足以下所有条件&#xff0c;我们称它是一个 强 密码&#xff1a;它有至少 8 个字符。至少包含 一个小写英文 字母。至少包含 一个大写英文 字母。至少包含 一个数字 。至少包含 一个特殊字符 。特殊字符为&#xff1a;"!#$%^&*()-" 中的一个。它 不…

Golang 从菜鸟到大咖的必经之路_GO 语言的转义字符、注释、规范和代码风格要求

目录 一、GO 语言转义字符 A.Golang 常用的转义字符&#xff08;escape char&#xff09;: B.课程练习 二、Go 语言注释&#xff1a; A.注释&#xff08;Comment&#xff09;: B.Go 语言中的注释类型&#xff1a; C.注释不会被编译 D.shifttab 三、规范的代码风格要求…

聚焦儿童羽绒服产业,看用友YonSuite打造领先实践的数智创新小灯塔

有一种冷“是妈妈觉得你冷”。每每想起小时候&#xff0c;为了应对寒冷的冬季&#xff0c;都会“全副武装”&#xff0c;裹得厚厚的&#xff0c;里三层外三层。 放到如今&#xff0c;有了羽绒服的萌娃们&#xff0c;已不再像我们当年一样穿得厚厚的了。现在的年轻爸妈喜欢装扮…

Udev 为设备节点起别名

查看设备信息&#xff1a; 操作udev&#xff0c;可以使用udevadm命令&#xff0c;如果我们要查看/dev/sda 设备节点信息&#xff0c;我们可以使用下面命令&#xff1a; 命令&#xff1a;udevadm info -a --namesda rootubuntu:/sys/kernel/debug/usb# udevadm info -a --nam…

【C语言】文件操作(1)

文件操作一、关于文件的基础知识1.为什么要学习文件2.什么是文件3.文本文件与二进制文件二、文件的打开和关闭1. 文件指针2.文件的打开和关闭3.文件结尾三、文件的顺序读写1.fputc与fgetc2.fputs与fgets3.fprintf与fscanf4.fwrite与fread5.三个标准流一、关于文件的基础知识 1…

低代码平台的优缺点

全文 1518 字 阅读时间约 5 分钟 本文首发于码匠技术博客 目录 低代码平台的优点 低代码平台的缺点 写在最后 低代码工具大大减少了开发者需要编写的代码量&#xff0c;通过增加可复用代码和组件的数量来帮助企业适应发展需求&#xff0c;设计和部署自定义应用程序以紧跟市…

科研快报|二代加三代扩增子测序探究苏铁植物根部复杂微生物群落组成

背景介绍苏铁俗称铁树&#xff0c;是地球上现存最古老的活化石植物&#xff0c;也是种子植物中最原始的种群。我国是世界上苏铁植物资源最丰富的国家之一&#xff0c;本文对我国的特有种德保苏铁&#xff08;Cycas debaoensis&#xff09;和仙湖苏铁&#xff08;Cycas fairylak…