Android中蓝牙设备的状态值管理

在Android中,蓝牙状态可以通过多种方式来描述,主要包括蓝牙适配器状态蓝牙设备连接状态以及蓝牙广播状态,其关键的蓝牙状态实现类有BluetoothAdapter、BluetoothDevicePairer、BluetoothDevice、BluetoothProfile,详细介绍如下:

BluetoothAdapter

  • BluetoothAdapter 是蓝牙通信的入口点,代表本地蓝牙适配器(蓝牙设备),通过该类,可发现其他蓝牙设备,查询已绑定的设备列表,以及创建和管理蓝牙连接

蓝牙适配器(BluetoothAdapter)的状态描述了本地蓝牙设备的功能状态:

  • 开启/关闭:使用 BluetoothAdapter.isEnabled() 来检查蓝牙是否开启
  • 正在开启/正在关闭:isDiscovering(),检查蓝牙适配器是否正处于发现模式
  • 获取蓝牙适配器的当前状态:在Android 4.2(API级别17)及以下版本中,可以使用 getState() 方法获取蓝牙适配器的当前状态,该方法返回一个int类型的枚举值,可以用来判断蓝牙是否正在开启或关闭
  • 连接状态:使用 BluetoothAdapter.getProfileConnectionState() 来获取特定蓝牙配置文件(如A2DP或HEADSET)的连接状态

BluetoothDevice

  • BluetoothDevice类代表了一个远程蓝牙设备,包含了该设备的地址(MAC地址)、名称和其他一些基本信息的属性,可使用该类,请求与远程设备的配对和连接,或者查询关于设备的信息,如绑定状态等
  • 每个蓝牙设备都有一个唯一的地址,通过该地址,Android设备可以与之建立连接和通信

蓝牙设备的连接状态检查方法:

  • 是否已连接:使用 BluetoothDevice.isConnected() 来检查特定设备是否已连接。
  • 绑定状态:使用 BluetoothDevice.getBondState() 来检查设备是否已绑定(配对)。

BluetoothDevice中的状态值

  • BluetoothDevice.BOND_NONE:表示与远程设备没有绑定关系
  • BluetoothDevice.BOND_BONDING:表示正在与远程设备建立绑定关系
  • BluetoothDevice.BOND_BONDED:表示已经与远程设备建立了绑定关系
    连接状态广播:
  • BluetoothDevice.ACTION_ACL_CONNECTED:表示与远程设备的连接已建立
  • BluetoothDevice.ACTION_ACL_DISCONNECTED:表示与远程设备的连接已断开
  • BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED:表示请求 断开和远程设备的连接

BluetoothProfile

  • BluetoothProfile是一系列接口的集合,用于定义蓝牙通信的不同配置文件本身不是实现类,Android提供了许多实现该接口的内部类,如:BluetoothA2dp、BluetoothHeadset 等,用于处理特定类型的蓝牙通信

  • 配置文件中定义设备在特定类型通信中应遵循的行为和规则(如:蓝牙耳机使用的配置文件和蓝牙鼠标不同)

  • Android中定义了一些标准的蓝牙配置文件,如:HEADSET (耳机)、A2DP(高级音频分发配置文件)、HEALTH(健康设备)等。每个配置文件都有其特定的通信协议和用途,开发者可通过实现这些接口来创建和特定类型的蓝牙设备交互的应用程序
    BluetoothHeadset:实现蓝牙耳机配置文件的类,用于管理蓝牙耳机与Android设备的连接
    BluetoothA2dp:实现A2dp配置文件的类,用于管理高级音频分发
    BluetoothHealth:实现蓝牙健康设备配置文件的类,用于与蓝牙健康设备交互

BluetoothProfile中的状态值

  • STATE_CONNECTED/STATE_DISCONNECTED:表示当前配置文件(如A2DP、HEADSET)已经与远程设备建立连接/没有建立连接
  • STATE_CONNECTING/STATE_DISCONNECTING:表示当前配置文件正在尝试与远程设备建立连接/正在尝试断开与远程设备的连接

BluetoothDevicePairer

是否已连接:使用 BluetoothDevice.isConnected() 来检查特定设备是否已连接。
连接状态:使用 BluetoothAdapter.getProfileConnectionState() 来获取特定蓝牙配置文件(如A2DP或HEADSET)的连接状态。
绑定状态:使用 BluetoothDevice.getBondState() 来检查设备是否已绑定(配对)。

  • 在某些情况下,BluetoothDevicePairer可能是一个第三方库或在某些定制Android系统中的类,用于简化蓝牙设备的配对(pairing)和绑定(bonding)过程
  • 配对是蓝牙设备之间建立安全连接的过程,通常需要用户输入一个配对码(通常是PIN码)来确保两个设备之间的通信是安全的
  • 如果BluetoothDevicePairer是某个特定实现,则可能提供了一系列方法来管理该过程,包括请求配对、确认配对请求、管理已配对的设备列表等
    由于Android系统的开放性,不同的设备或系统版本可能会提供不同的API或工具类,因此BluetoothDevicePairer可能并不是通用的Android开发术语

获取和监听蓝牙状态

  • 蓝牙广播状态通常涉及到监听系统发出的广播,以便了解蓝牙状态的变化:
  • 状态改变:通过注册接收器(BroadcastReceiver)监听 ACTION_STATE_CHANGED广播,来得知蓝牙适配器的状态改变
  • 发现模式:通过 ACTION_DISCOVERY_STARTED 和ACTION_DISCOVERY_FINISHED广播来监听蓝牙发现模式的状态
  • 配对请求:通过ACTION_PAIRING_REQUEST 广播来处理配对请求
  • 这些状态帮助开发者理解和跟踪蓝牙设备在特定时刻的状态,以便于编写逻辑来处理不同的状态变化,获取和监听蓝牙状态的代码示例(使用BroadcastReceiver & BluetoothAdapter监听蓝牙状态变化):
	// 获取蓝牙适配器
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();// 检查蓝牙是否开启
if (bluetoothAdapter.isEnabled()) {// 蓝牙已开启
}// 注册广播接收器来监听蓝牙状态变化
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(mReceiver, filter);// 广播接收器内部类
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {final String action = intent.getAction();if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);switch (state) {case BluetoothAdapter.STATE_OFF:// 蓝牙已关闭break;case BluetoothAdapter.STATE_TURNING_ON:// 蓝牙正在开启break;case BluetoothAdapter.STATE_ON:// 蓝牙已开启break;case BluetoothAdapter.STATE_TURNING_OFF:// 蓝牙正在关闭break;}}}
};// 在不需要时注销广播接收器
@Override
protected void onDestroy() {super.onDestroy();unregisterReceiver(mReceiver);
}
  • 或使用BluetoothDevice监听蓝牙状态变化:
// 假设你有一个BroadcastReceiver来监听蓝牙状态变化
private BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);switch (bondState) {case BluetoothDevice.BOND_NONE:// 设备未绑定break;case BluetoothDevice.BOND_BONDING:// 正在绑定break;case BluetoothDevice.BOND_BONDED:// 设备已绑定break;}} else if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {// 设备已连接} else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {// 设备已断开}// 其他状态处理...}
};

小结

  • 从Android6.0(API 23)开始,Google引入了新的权限模型,要求应用程序在使用蓝牙功能时请求相应的权限,并且用户必须在运行时明确授权
  • 在Android蓝牙开发时,开发者通常使用BluetoothAdapter 发现其他蓝牙设备,查询已绑定的设备列表,以及创建和管理蓝牙连接;BluetoothAdapter来获取已配对的设备列表;使用BluetoothDevice来与单个设备交互;使用BluetoothProfile来处理特定类型的蓝牙通信
  • 蓝牙广播状态通常涉及到监听系统发出的广播,以便了解蓝牙状态的变化

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

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

相关文章

基于Ubuntu 20.04 实现MySQL主从同步

基于Ubuntu 20.04 实现MySQL主从同步 环境准备: 1.mysql-master:192.168.1.21 2.mysql-slave:192.168.1.22 1. 安装MySQL 8.0 在主服务器和从服务器上执行以下命令安装MySQL 8.0: sudo apt update sudo apt install mysql-server安装完成后&#xf…

Vite - 项目打包从 0 到 1(完美解决打包后访问白屏问题)

目录 开始 修改资源相对地址 引入 vitejs/plugin-legacy 插件并配置 修改打包指令 修改 router 中的 history 前端配置跨域相关 打包后成功访问 开始 修改资源相对地址 在 vite.config.js 文件中配置如下: export default defineConfig({base: ./, //1.打包…

揭秘循环购模式:为何商家愿“送钱”,用户能边消费边赚钱?

大家好,我是你们的电商专家吴军。今天,我将带大家走进一个神秘而又吸引人的商业模式——循环购模式。你可能会疑惑,为什么消费者能在这里“消费1000送2000”,每天还能领取现金并提现?商家真的在“送钱”吗?…

(css)el-tabs滚动按钮浮动问题

(css)el-tabs滚动按钮浮动问题 修改前: 修改后: 思路:找到相应元素,降低层级 css写法: ::v-deep .el-tabs__nav {z-index: 1; }

MySql出现的问题

1.在控制面吧输入mysql显示不是内部命令 2.找到mysql安装的目录,复制目录路径 3.打开系统属性设置环境变量中的Path将路径添加到里面 4.添加好以后将控制面板重新打开输入命令 2.解决安装mysql错误 导致多个mysql服务删除教程 1.用管理员身份打开cmd命令板 2.在…

各地区城乡居民基本养老保险情况数据,Shp+excel格式

基本信息. 数据名称: 各地区城乡居民基本养老保险情况数据 数据格式: Shpexcel 数据几何类型: 面 数据坐标系: WGS84 数据时间:2008-2018年 数据来源:网络公开数据 数据可视化.

Android Studio Koala | 2024.1.1 发布,快来看看有什么更新吧

自从三年前 Android Studio 更改了版本方案之后,从 Arctic Fox 开始每个主要版本都发布一个动物代号,同时版本迭代更新的节奏也越来越快,当然“填坑”的速度和“开坑”的速度几乎也“持平”,可以说每个版本都有痛点,都…

68. UE5 RPG 优化敌人角色的表现效果

我们现在已经有了四个敌人角色,接下来,处理一下在战斗中遇到的问题。 处理角色死亡后还会攻击的问题 因为我们有角色溶解的效果,角色在死亡以后的5秒钟才会被销毁掉。所以在这五秒钟之内,角色其实还是会攻击。主要时因为AI行为树…

新手指南:如何解决JavaScript导出CSV文件不完整的问题

在JavaScript中处理CSV文件时,需要特别注意一些特殊字符,例如逗号、双引号、换行符等。这些字符可能会影响CSV文件的解析,导致数据错乱。 1. 逗号 (,) 逗号是CSV文件默认的列分隔符。如果数据字段中包含逗号,需要将该字段用双引号…

使用ffmpeg进行音频处理

音频处理是数字媒体制作中不可或缺的一部分,而ffmpeg作为一款强大的多媒体处理工具,为我们提供了丰富的音频处理功能。 一、查看音频信息 在处理音频之前,了解音频的基本信息是非常重要的。FFmpeg的ffprobe工具可以帮助我们查看音频的详细信息,如采样率、位深等。 示例命…

【踩坑】修复Ubuntu远程桌面忽然无法Ctrl C/V复制粘贴及黑屏

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 说在前面: 需要注意的是,我发现他应该是新开了一个窗口给我。我之前打开的东西,在这个新窗口里都没有了&#xff0c…

区间预测 | Matlab实现GRU-ABKDE门控循环单元自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现GRU-ABKDE门控循环单元自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现GRU-ABKDE门控循环单元自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现GRU-ABKDE门控循环单元自适应…

十进制转二进制的计算法则

1、手动计算 计算规则:十进制整数转换为二进制整数采用"除2取余,逆序排列"法。 具体做法:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行&…

Docker从容器打包镜像到本地保存与加载

1、Docker 从容器打包成镜像 $ docker commit <container_id_or_name> <repository_name>:<tag>其中&#xff1a; <container_id_or_name> 是你要打包的容器的 ID 或名称。<repository_name> 是你希望给新镜像起的名称。<tag> 是你希望给…

JAVA动态表达式:Antlr4 表达式树解析

接上面 JAVA动态表达式&#xff1a;Antlr4 G4 模板 读取字符串表达式结构树-CSDN博客 目前已经实现了常量及分组常规表达式的解析。 String formula "啦啦啦1 and 11 and 23 and 1123 contains 1 and 23455 notcontains 5"; String formula "啦啦啦1 and (…

SAP 角色授权账户 重复的问题 解决方案

直接从agr_usrs 里面删除新的 *&---------------------------------------------------------------------* *& Report ZRPT_BC_ROLEASSIGN_RM_DUP *&---------------------------------------------------------------------* *&角色授权去重 *&--------…

2025长沙眼博会,2025湖南眼睛健康与眼科医疗展览会

长沙2025全国眼睛健康产业博览会暨眼科医学大会&#xff1a;专注眼康产业&#xff0c;推动区域眼康发展 长沙2025全国眼睛健康产业博览会暨眼科医学大会&#xff0c;将于8月29-31日&#xff0c;在长沙红星国际会展中心举办&#xff1b; ——随着科技的飞速发展和社会进步&…

植物大战僵尸杂交版 fatal error及问题解决闪退

echo off set KEY_NAMESoftware\PopCap\PlantsVsZombies set VALUE_NAMEScreenmode set DATA0 reg add HKCU%KEY_NAME% /v %VALUE_NAME% /t REG_DWORD /d %DATA% /f if %errorlevel% neq 0 ( echo 注册表数值数据修改失败 ) else ( echo 注册表数值数据已成功修改为0 ) 将上述…

【Mysql】 MySQL索引的使用

文章目录 前言一、索引解释二、代码实现三、总结 前言 在处理大量数据的系统中&#xff0c;如何快速准确的获取所需的信息是一个重要的问题。这就像在一个巨大的图书馆中寻找一本书&#xff0c;如果没有目录或指南&#xff0c;这将是一项艰巨的任务。在数据库中&#xff0c;我…

requests post json/data;requests response 接收不同数据

1、requests post json/data 在Python的requests库中&#xff0c;当你发送POST请求时&#xff0c;可以选择使用json参数或data参数来传递数据。这两者之间的主要区别在于它们如何被序列化和发送到服务器。 json参数&#xff1a; 当你使用json参数时&#xff0c;requests库会自…