Android13 蓝牙协议属性配置详解
Android13 蓝牙协议属性配置详解
文章目录
- Android13 蓝牙协议属性配置详解
- 一、前言
- 二、Android13 蓝牙协议属性配置
- 1、Profile 属性和暴露接口的定义
- 2、蓝牙协议属性定义
- 3、系统代码中判断蓝牙协议是否使能的代码
- 三、其他
- 1、adb 窗口中查看蓝牙协议属性
- 2、动态设置蓝牙prop协议属性有用吗
- 3、opp协议为false时蓝牙文件传输相关日志
- 4、Android11 蓝牙协议详解
一、前言
Android系统中蓝牙协议是否使能一般是通过一个属性值,如果这个属性值设置为false,
会导致这个协议的服务未启动,也就是说这个蓝牙功能会没有作用。
比如 Android 蓝牙传输文件协议是opp,如果opp未使能,那么整个系统是不支持蓝牙文件传输的。
在Android13之前的版本,我们可以通过 config.xml 中的 profile_supported_a2dp 属性控制蓝牙的某个协议是否使能。
比如Android13 以前的蓝牙协议使能属性:
<bool name="profile_supported_a2dp">true</bool><bool name="profile_supported_a2dp_sink">true</bool><bool name="profile_supported_hs_hfp">true</bool><bool name="profile_supported_hfpclient">false</bool>
这些属性是res属性,只能在资源文件中修改,还不方便查询。
但是在Android13 或者更新的版本,很多属性都需要一个新的东西控制使能蓝牙协议了,那就是蓝牙属性profile属性。
Android13 以及更新的版本蓝牙协议使能属性:
bluetooth.profile.a2dp.source.enabled=true
bluetooth.profile.avrcp.target.enabled=true
...
bluetooth.profile.opp.enabled=true
bluetooth.profile.a2dp.sink.enabled=true
这些属性是prop属性,非常方便查询,直接修改的话,估计可以,但是重启会失效。
这个东西如果没有了解过,是无从下手的,蓝牙的profile属性读取和控制在Java代码中是找不到的。
如果想要学习了解,可以继续往下看看。
本文简单参考:https://blog.csdn.net/weixin_47456647/article/details/139493190
二、Android13 蓝牙协议属性配置
蓝牙的协议属性虽然都是prop属性,但是无法代码中并不是直接判断prop属性决定使能,
而是使用Profile提供的接口,判断蓝牙协议是否使能。
1、Profile 属性和暴露接口的定义
system\libsysprop\srcs\android\sysprop\BluetoothProperties.sysprop
注意,下面的代码只是定义蓝牙prop属性和关联Java Api方法的地方,具体赋值是在其他地方。
module: "android.sysprop.BluetoothProperties"
owner: Platform
...
# Whether the Advanced Audio Distribution Profile (A2DP) Sink role is enabled on this device.
# Set by vendors overlay, read at Bluetooth initialization
prop {api_name: "isProfileA2dpSinkEnabled" //暴露的apitype: Booleanscope: Publicaccess: Readonlyprop_name: "bluetooth.profile.a2dp.sink.enabled"
}//系统Java代码中调用 BluetoothProperties.isProfileA2dpSinkEnabled()就能查到对于的prop属性//这也是为啥Java代码中没有直接获取 bluetooth.profile 属性的原因。# Whether the Advanced Audio Distribution Profile (A2DP) Source role is enabled on this device.
# Set by vendors overlay, read at Bluetooth initialization
prop {api_name: "isProfileA2dpSourceEnabled"type: Booleanscope: Publicaccess: Readonlyprop_name: "bluetooth.profile.a2dp.source.enabled"
}# BR/EDR Page scan activity configuration
prop {api_name: "getClassicPageScanType"type: UIntscope: Internalaccess: Readonlyprop_name: "bluetooth.core.classic.page_scan_type"
}...
这个文件主要就是绑定某些api和prop属性的关联。
可以看到上面定义的access 都是只读,说明直接修改不一定有用。
在系统的java代码中,只要调用静态方法:BluetoothProperties.XXX()就可以判断某个协议属性是否使能了。
2、蓝牙协议属性定义
prop属性的默认值一般是通过XXX.mk文件进行设置默认值的
但是不同的供应商方案的系统可能定义的方式不一样。
比如 aml Android14 311D2方案 修改的路径:
PRODUCT_PROPERTY_OVERRIDES += \bluetooth.profile.asha.central.enabled=true \bluetooth.profile.gatt.enabled=true \bluetooth.profile.hid.host.enabled=true \bluetooth.profile.mcp.server.enabled=true \bluetooth.profile.opp.enabled=true \bluetooth.profile.pan.nap.enabled=true \bluetooth.profile.pan.panu.enabled=true
比如 mtk Android14 9679方案 修改的路径:
device\mediatek\mt5879\configs\bluetooth.prop
bluetooth.device.class_of_device=40,4,60
bluetooth.profile.a2dp.source.enabled?=false
bluetooth.profile.avrcp.target.enabled?=true
bluetooth.profile.bas.client.enabled?=true
···
bluetooth.profile.opp.enabled?=false //默认为false,设置true才能正常传输文件
这种看起来是供应商自定义的,不像上面mk文件定义是原生的。
网上看有些mtk方案也有写在 device.mk里面定义prop属性的,还有些其他方案的会定义在其他xxx.mk
如果不确定定义在哪里,就在源码里面全局搜索一下吧,命令:
//搜索其中一个比较注意的prop属性关键字
grep -nr "bluetooth.profile.avrcp.target.enabled"
//或者
grep -nr "bluetooth.profile.opp.enabled"还可以搜索过来某些文件进行搜索
find . -name "*.mk" | xargs grep "bluetooth.profile.opp.enabled"
find . -name "*.prop" | xargs grep "bluetooth.profile.opp.enabled"
这样就能知道其他蓝牙协议属性定义的地方了。
大部分方案都是定义在 device、vendor目录下,也有小概率定义在package、hardware、framework、prebuilts等目录。
3、系统代码中判断蓝牙协议是否使能的代码
packages\modules\Bluetooth\android\app\src\com\android\bluetooth\a2dp\A2dpService.java
//是否支持蓝牙声音功能,蓝牙连接耳机后声音从耳机发出public static boolean isEnabled() {return BluetoothProperties.isProfileA2dpSourceEnabled().orElse(false);}
每个蓝牙协议服务都在类似的判断静态方法,从而判断是否支持该协议。
其他的蓝牙协议服务也是类似的方式进行判断是否使能。
正式代码中未看到有直接判断prop 属性的方式,判断蓝牙是否使能的代码:
boolean isEnableXXX = SystemProperties.getBoolean("XXX", false);
全局搜索后,看到在某个Test的类中有这个使用。所以是不建议这样使用的。
但是也不是不能这样使用,特别是普通应用中,或没有导入framework Jar包的系统应用中都是有可能无法调用到 BluetoothProperties 这个类的,可以使用这个方法进行判断属性的方式判断蓝牙协议是否使能。
三、其他
1、adb 窗口中查看蓝牙协议属性
console:/ # getprop | grep bluetooth.profile
[bluetooth.profile.a2dp.source.enabled]: [true]
[bluetooth.profile.asha.central.enabled]: [true]
[bluetooth.profile.avrcp.target.enabled]: [true]
[bluetooth.profile.gatt.enabled]: [true]
[bluetooth.profile.hfp.ag.enabled]: [true]
[bluetooth.profile.hid.host.enabled]: [true]
[bluetooth.profile.mcp.server.enabled]: [true]
[bluetooth.profile.opp.enabled]: [true]
[bluetooth.profile.pan.nap.enabled]: [true]
[bluetooth.profile.pan.panu.enabled]: [true]
console:/ #
getprop 过滤蓝牙相关prop,就能看到所有的蓝牙协议相关属性。
2、动态设置蓝牙prop协议属性有用吗
从打印日志看打开蓝牙的时候蓝牙相关的协议服务会进行重启,
关闭蓝牙蓝牙相关的协议服务会关闭。
所以理论上,动态修改蓝牙prop属性,在关开一次蓝牙,那么就会修改生效。
目前我只试过 bluetooth.profile.opp.enabled 确实是可以动态修改的,其他属性不确定。
3、opp协议为false时蓝牙文件传输相关日志
AML Android14 上 蓝牙相关日志:
06-14 16:22:49.238 8759 8791 I bluetooth: packages/modules/Bluetooth/system/gd/hci/hci_layer.cc:119 drop: Dropping event MAX_SLOTS_CHANGE
06-14 16:22:49.242 8759 8759 I BluetoothPhonePolicy: processDeviceConnected, device=XX:XX:XX:XX:16:0E
06-14 16:22:49.242 8759 8759 D BluetoothDatabase: setConnection: device XX:XX:XX:XX:16:0E and isA2dpDevice=false
06-14 16:22:49.242 8759 8759 D BluetoothDatabase: Updating last connected time for device: XX:XX:XX:XX:16:0E to 2
06-14 16:22:49.242 8759 8759 D BluetoothDatabase: updateDatabase XX:XX:XX:XX:16:0E
06-14 16:22:49.248 8759 8791 I bluetooth: packages/modules/Bluetooth/system/main/shim/acl.cc:558 OnReadClockOffsetComplete: UNIMPLEMENTED
06-14 16:22:49.306 8759 8786 I l2c_csm : packages/modules/Bluetooth/system/stack/l2cap/l2c_csm.cc:338 l2c_csm_closed: Check security for psm 0x0001, status 0
06-14 16:22:49.320 8759 8786 W bt_sdp : packages/modules/Bluetooth/system/main/bte_logmsg.cc:108 LogMsg: PBAP PSE dynamic version upgrade is not enabled
06-14 16:22:49.325 8759 8786 W bt_sdp : packages/modules/Bluetooth/system/main/bte_logmsg.cc:108 LogMsg: SDP - Rcvd L2CAP disc, process pend sdp ccb: 0x42
06-14 16:22:49.334 8759 8786 I l2c_csm : packages/modules/Bluetooth/system/stack/l2cap/l2c_csm.cc:338 l2c_csm_closed: Check security for psm 0x0001, status 0
06-14 16:22:49.345 8759 8786 W bt_sdp : packages/modules/Bluetooth/system/main/bte_logmsg.cc:108 LogMsg: PBAP PSE dynamic version upgrade is not enabled
06-14 16:22:49.351 8759 8786 W bt_sdp : packages/modules/Bluetooth/system/main/bte_logmsg.cc:108 LogMsg: SDP - Rcvd L2CAP disc, process pend sdp ccb: 0x4306-14 16:22:53.352 8759 8786 W l2c_link: packages/modules/Bluetooth/system/stack/l2cap/l2c_link.cc:521 l2c_link_timeout: TODO: Remove this callback into bcm_sec_disconnect
06-14 16:22:53.352 8759 8786 I btm_acl : packages/modules/Bluetooth/system/stack/acl/btm_acl.cc:205 hci_btsnd_hcic_disconnect: Disconnecting peer:xx:xx:xx:xx:16:0e reason:HCI_ERR_PEER_USER comment:stack::l2cap::l2c_link::l2c_link_timeout All channels closed
06-14 16:22:53.438 8759 8786 E btm_sco : packages/modules/Bluetooth/system/stack/btm/btm_sco.cc:1137 btm_sco_on_disconnected: Unable to find sco connection
06-14 16:22:53.438 8759 8786 I btm_acl : packages/modules/Bluetooth/system/stack/acl/btm_acl.cc:2740 btm_acl_iso_disconnected: ISO disconnection from GD, handle: 0x0b, reason: 0x16
06-14 16:22:53.439 8759 8786 I btif_av : packages/modules/Bluetooth/system/btif/src/btif_av.cc:3565 btif_av_acl_disconnected: btif_av_acl_disconnected: Peer xx:xx:xx:xx:16:0e : ACL Disconnected
这是手机端发送后,接收端的蓝牙相关日志;
从日志未看出啥明显异常,也没有提示opp服务无法开启,但是只有ACL连接和断开的日志。
这里仅供参考。不同方案上可能有区别。
4、Android11 蓝牙协议详解
https://blog.csdn.net/wenzhi20102321/article/details/125826972
相关协议知识:
拨号网络配置文件 (DUN):
DUN 提供了通过 Bluetooth 无线技术接入 Internet 和其它拨号服务的标准。
最常见的情况是在手机上拨号,从膝上型计算机以无线方式接入 Internet。OPP:对象存储规范(Object Push Profile),最为常见的,文件的传输都是使用此协议。HFP:(Hands-free Profile),让蓝牙设备可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要视蓝牙耳机及电话是否支持。HDP: HDP (Health Device Profile) 蓝牙医疗设备模式 可以创建支持蓝牙的医疗设备,使用蓝牙通信的应用程序,例如心率监视器,血液,温度计和秤。HID() 人机接口设备配置文件
HID 配置文件定义了 Bluetooth HID(如键盘、指向设备、游戏设备及远程监视设备)使用的协议、程序及功能HSP(Handset Profile)耳机模式 ,用于支持蓝牙耳机与移动电话之间使用A2DP: Advanced Audio Distribution Profile (A2DP) 高级音频传输模式 A2DP是能够采用耳机内的芯片来堆栈数据,达到声音的高清晰度。有A2DP的耳机就是蓝牙立体声耳机。
PAN:个人局域网(Personal Area Network)最新为了满足需求而出现的, 在小范围内能够将个人设备(自己的手机 电脑笔记本等)互联而组成的网络。DP( Service Discovery Protocol )服务发现协议
提供应用程序在蓝牙环境中发现哪个服务可用和决定那些可用服务的特征。GAP(Generic Access Profile)通用访问应用
一般访问应用规范定义了蓝牙设备如何发现和建立与其他设备的安全(或不安全)连接。
它处理一些一般模式的业务(如询问、命名和搜索)和一些安全性问 题(如担保),
同时还处理一些有关连接的业务(如链路建立、信道和连接建立)。GAP规定的是一些一般性的运行任务。
因此,它具有强制性,并作为所有其它 蓝牙应用规范的基础。
不同的Android版本对蓝牙协议的设置代码不同,但是蓝牙协议的基本知识是一样的。
相关文章:
Android13 蓝牙协议属性配置详解
Android13 蓝牙协议属性配置详解 文章目录 Android13 蓝牙协议属性配置详解一、前言二、Android13 蓝牙协议属性配置1、Profile 属性和暴露接口的定义2、蓝牙协议属性定义3、系统代码中判断蓝牙协议是否使能的代码 三、其他1、adb 窗口中查看蓝牙协议属性2、动态设置蓝牙prop协…...

南通国际高中有哪些?南通惠立学校高中部校长见面日重磅来袭
惠灵顿(中国)自2011年成立以来,一直坚持深耕国际与双语教育,拥有丰厚的办学经验。依托于集团化的深厚经验南通惠立学校于2024-2025学年开设9-11年级,这所南通国际高中为高中学生搭建一个集卓越升学成果、强大师资、纯正…...
Al智能图像处理APP,安卓手机专用一键优化工具资源合集下载
### 标题:Al智能图像处理APP,安卓手机专用一键优化工具资源合集下载 随着科技的进步,图像处理技术也在不断提升。为了满足用户对图像处理日益增长的需求,我们隆重推出了一款功能强大的图像处理工具——Al智能图像处理APP。这款安…...

Kettle根据分类实现Excel文件拆分——kettle开发31
将整理好的一份供应商付款明细Excel文件,按供应商拆分成多个Excel文件。 实现思路 本文我们首先将供应商付款明细表,按照“名称”拆分成多份Excel文件。拆分Excel文件打算用两个转换实现,一个用来将Excel数据读取到参数中,另外一…...
merkle tree中文
Merkle tree merkle tree中文文档英文文档 #include <cstdlib> #include <string> #include <bitcoin/bitcoin.hpp>BC_USE_LIBBITCOIN_MAINusing namespace bc;bc::hash_digest calculate_merkle_root(bc::hash_list &merkle);int bc::main(int argc, …...

制作自己的 @OnClick、@OnLongClick(告别 setOnClickListener,使用注解、反射和动态代理)
前言 前面我们说过 ButterKnife 这个库,这个库实现不仅实现了 View 的绑定,而且还提供了大量的注解如 BindView、OnClick、OnLongClick 等来简化开发过程中事件绑定。而这些功能的实现是通过 APT 也就是注解处理器,在编译期间生成 Java 代码…...
Android基础-RecyclerView的优点
一、引言 在Android开发中,RecyclerView是一个强大而灵活的控件,用于展示大量数据集合的视图。相比于传统的ListView和GridView,RecyclerView提供了更高的性能、更多的布局选择和更丰富的交互体验。本文将详细阐述RecyclerView的功能作用以及…...

C# Winform 用户控件,扩展控件,自定义控件综合实例
Control类是Windows窗体控件的基类,它提供了在 Windows 窗体应用程序中进行可视显示所需的基础结构,可以通过继承来扩展熟悉的用户控件和现有控件的功能。本列介绍三种不同自定义控件以及怎么创建他们。 自定义控件分类 用户控件:基本控件的…...
经济学和金融学有什么区别?
中文版 金融学和经济学是两个密切相关但有所不同的学科,它们各自侧重于不同的研究领域和方法。 经济学 (Economics) 经济学是研究如何配置有限资源以满足人类无限需求的学科。它可以分为两个主要分支: 宏观经济学 (Macroeconomics): 研究经济整体的行…...

Java课程设计:基于swing的学生信息管理系统
文章目录 一、项目介绍二、项目展示三、源码展示四、源码获取 一、项目介绍 这款Java swing实现的学生信息管理系统和jsp版本的功能很相似,简单的实现了班级信息的增删改查,学生信息的增删改查,数据库采用的是mysql,jdk版本不限&…...
【代码】3d->video
mesh->video import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib.animation import FuncAnimation import matplotlib.animation as animation from pywavefront import Wavefront import osnamedog # 读取OBJ文…...

算法01 递推算法及相关问题详解【C++实现】
目录 递推的概念 训练:斐波那契数列 解析 参考代码 训练:上台阶 参考代码 训练:信封 解析 参考代码 递推的概念 递推是一种处理问题的重要方法。 递推通过对问题的分析,找到问题相邻项之间的关系(递推式&a…...

自动化测试火狐下载文件
本篇文章介绍selenium中火狐浏览器如何下载文件。比如我想把这个MP4的视频文件下载下来。 点击之后查看下载的类型是video/mp4 指定使用火狐浏览器 profile webdriver.FirefoxOptions() # 设置firefox默认的下载路径,0表示桌面,1表示我的下载…...

基于JSP技术的定西扶贫惠农推介系统
开头语:你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:JSP 数据库:MySQL 技术:B/S架构、JSP技术 工具:Eclipse、MySQL、Tomcat 系统展示 首…...

Linux 终端窗口设置为透明
Linux 终端窗口设置为透明 打开终端 右键鼠标 选择Profile Preferences 点击Background 选择 Transparent background 拖动滑条调整透明度 完成。...

MySQL 中 Varchar(50) 和 varchar(500) 区别是什么?
一. 问题描述 我们在设计表结构的时候,设计规范里面有一条如下规则: 对于可变长度的字段,在满足条件的前提下,尽可能使用较短的变长字段长度。 为什么这么规定?我在网上查了一下,主要基于两个方面 基于存储空间的考…...

强化RAG:微调Embedding还是LLM?
为什么我们需要微调? 微调有利于提高模型的效率和有效性。它可以减少训练时间和成本,因为它不需要从头开始。此外,微调可以通过利用预训练模型的功能和知识来提高性能和准确性。它还提供对原本无法访问的任务和领域的访问,因为它…...
提取 Excel单元格文本下的超链接
在Excel中,可以使用内置的函数来提取单元格中的超链接地址。如果你有一个包含超链接的单元格,例如B1,你可以使用以下步骤来提取这个超链接: 在一个新的单元格(例如C1)中,输入以下公式ÿ…...

一键安全体检!亚信安全携手鼎捷软件推出企业安全体检活动 正式上线
亚信安全联合鼎捷软件股份有限公司(以下简称“鼎捷软件”)正式推出“一键安全体检”服务。亚信安全网络安全专家将携手鼎捷软件数据安全专家,围绕企业的数智安全状况,进行问题探索与治愈、新问题预测与预警,在全面筛查…...
numpy - array(1)
一维数据:向量 二位数据:矩阵 维度超过三维的数据:张量 这些数据在numpy中统称array (1)使用穷举法创建多为数据,接受列表或者元组类型的数据 a numpy.array([1, 2, 3]) b numpy.array([[1, 2, 3], (4, 5, 6), [7, 8, 9]]) (2)创建所有元…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
python打卡day49@浙大疏锦行
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...