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来处理特定类型的蓝牙通信
- 蓝牙广播状态通常涉及到监听系统发出的广播,以便了解蓝牙状态的变化
相关文章:
Android中蓝牙设备的状态值管理
在Android中,蓝牙状态可以通过多种方式来描述,主要包括蓝牙适配器状态、蓝牙设备连接状态以及蓝牙广播状态,其关键的蓝牙状态实现类有BluetoothAdapter、BluetoothDevicePairer、BluetoothDevice、BluetoothProfile,详细介绍如下&…...
关于ReactV18的页面跳转传参和接收
一、使用路由方式进行传参和接收(此处需使用 useNavigate 和 useParams 两个hooks) 1 首先需要配置好路由形式如下 :id(参数) { path: "/articleDetail/:id", element: lazyElement(<ArticleDetail />), }, 2 传递参数 使用 useNaviga…...
南京观海微电子-----PCB设计怎样降低EMI
开关模式电源是AC-DC或DC-DC电源的通用术语,这些电源使用具有快速开关动作的电路进行电压转换/转换(降压或升压)。随着每天开发出更多的设备(潜在的EMI受害者),克服EMI成为工程师面临的主要挑战,并且实现电磁兼容性(EMC)与使设备正常运行同等…...
黑苹果/Mac如何升级 Mac 新系统 Sequoia Beta 版
Mac升级教程 有必要提醒一下大家,开发者测试版系统一般是给开发者测试用的,可能存在功能不完善、部分软件不兼容的情况,所以不建议普通用户升级,如果实在忍不住,升级之前记得做好备份。 升级方法很简单: …...
2024年主流工单系统横向对比
一:智齿科技 智齿客服App可以接收工单、查看工单、分配工单、处理工单,客户问题随时随地快速解决。 与云客户中心实时连接,客户以往的浏览轨迹、聊天信息、通话记录、工单历史一目了然。 配合智齿云呼叫中心/机器人客服/人工在线客服&…...
实用软件下载:Studio One最新安装包及详细安装教程
Studio One 6是一款功能丰富、专业级的音乐制作软件,它具备灵活的工作流程和高效的团队协作能力,能帮助用户实现高质量的音乐创作和制作。 智能模板更快的启动,全新的智能模板为你手头的任务提供了必要的工具集,包括基本录制、混音…...
网络安全练气篇——常见服务端口对应漏洞
常见的端口所对应的已知漏洞 21 FTP服务的数据传输端口 22 FTP服务的连接端口,可能存在 弱口令暴力破解 389 LDAP目录访问协议,有可能存在注入、弱口令 443 HTTPS端口,心脏滴血等与SSL有关的漏洞 445 SMB服务端口,可能存…...
WPF学习(3)--不同类通过接口实现同种方法
一、接口概述 1.接口的概念 在C#中,接口(interface)是一种引用类型,它定义了一组方法、属性、事件或索引器,但不提供实现。接口只定义成员的签名,而具体的实现由实现接口的类或结构体提供。接口使用关键字…...
体验版小程序访问不到后端接口请求失败问题解决方案
文章目录 解决方案一:配置合法域名解决方案二:开发调试模式第一步:进入开发调试模式第二步:启用开发调试 注意事项结语 🎉欢迎来到Java面试技巧专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&…...
【Linux文件篇】磁盘到用户空间:Linux文件系统架构全景
W...Y的主页 😊 代码仓库分享 💕 前言:我们前面的博客中一直提到的是被进程打开的文件,而系统中不仅仅只有被打开的文件还有很多没被打开的文件。如果没有被打开,那么文件是在哪里进行保存的呢?那我们又如何快速定位…...
数据分析-Excel基础函数的使用
Excel基础函数: sum:求和 sumif:单条件求和 sumifs:多条件求和 subtotal:根据筛选求和 if:逻辑判断 vlookup:连接匹配数据 match:查找数值在区域中的位置 index:根据区域的位置返回数值 match、index:一起使用:自动根据列名查找数据 sumifs、match、ind…...
速盾的防护策略有哪些?
在当今数字化时代,网络安全至关重要,而速盾作为一款优秀的安全防护工具,拥有一系列全面且有效的防护策略。 首先,速盾采用了先进的访问控制策略。通过严格的身份验证和授权机制,确保只有合法的用户和应用程序能够访问特…...
LabVIEW RT在非NI硬件上的应用与分析
LabVIEW RT(实时操作系统)可运行在非NI(National Instruments)硬件上,如研华工控机,但需要满足特定硬件要求。本文从硬件要求、开发和运行差异、可靠性、稳定性、优势和成本等多角度详细分析在非NI硬件上运…...
使用Python批量处理Excel的内容
正文共:1500 字 10 图,预估阅读时间:1 分钟 在前面的文章中(如何使用Python提取Excel中固定单元格的内容),我们介绍了如何安装Python环境和PyCharm工具,还利用搭好的环境简单测试了一下ChatGPT提…...
k8s+pv+pvc+nas 数据持久化volumes使用
1 k8s pod申请持久化卷配置 apiVersion: v1 kind: Service metadata:name: $IMG_NAMEnamespace: rz-dtlabels:app: $IMG_NAME spec:type: NodePortports:- port: 8091nodePort: 31082 #service对外开放端口selector:app: $IMG_NAME --- apiVersion: apps/v1 kind: Deployment …...
C++算法-青蛙跳台阶【面试】
"青蛙跳台阶"问题是一个经典的递归问题,也与斐波那契数列有关。问题是这样的:一只青蛙站在一个n阶台阶上,它每次可以跳1阶或2阶,问青蛙跳到顶端总共有多少种跳法。 这个问题可以用递归或动态规划来解决。以下是使用C实…...
px转rem插件postcss-plugin-px2rem使用方法(浏览器缩放页面自适应)
px转rem插件postcss-plugin-px2rem使用方法(浏览器缩放页面自适应) 1. 常见屏幕自适应的布局 百分比布局rem布局css媒体查询在前端框架设计初期,应优先选择好页面布局方式 2. postcss-plugin-px2rem插件的使用 官网地址:https…...
批量文件重命名技巧:轻松替换删除文件夹名中的字母,实现高效文件管理新境界
在数字化时代,我们每天都会面对大量的文件和文件夹。无论是工作文档、学习资料还是个人收藏,文件命名的规范性都显得尤为重要。然而,手动一个一个去修改文件名,不仅耗时耗力,还容易出错。那么,有没有一种方…...
windows设备/路由设备上ip地址如何查看、使用
在Windows设备上查看本地IP地址(IPv4和IPv6): 使用命令提示符: 打开命令提示符(在Windows中按Win R,然后输入"cmd"并按Enter)。在命令提示符窗口中,输入以下命令以查看…...
服务端⾼并发分布式结构演进之路
在进行技术学习过程中,由于大部分读者没有经历过一些中大型系统的实际经验,导致无法从全局理解一些概念,所以本文以一个"电子商务"应用为例,介绍从一百个到千万级并发情况下服务端的架构的演进过程,同时列举…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
摘要:在消费市场竞争日益激烈的当下,传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序,探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式,分析沉浸式体验的优势与价值…...
ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...
