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)。在命令提示符窗口中,输入以下命令以查看…...

服务端⾼并发分布式结构演进之路
在进行技术学习过程中,由于大部分读者没有经历过一些中大型系统的实际经验,导致无法从全局理解一些概念,所以本文以一个"电子商务"应用为例,介绍从一百个到千万级并发情况下服务端的架构的演进过程,同时列举…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...