当前位置: 首页 > news >正文

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来处理特定类型的蓝牙通信
  • 蓝牙广播状态通常涉及到监听系统发出的广播,以便了解蓝牙状态的变化

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java:缓存行和伪共享
  • Mysql中索引详解
  • VS2019+QT5.15调用动态库dll带有命名空间
  • 分布式文件存储 - - - MinIO从入门到飞翔
  • Verilog-Behavior Level 和 RTL Level 和 GATE Level的区别
  • Git工具
  • flutter中采用腾讯云COS进行图片存储
  • Flutter 实现dispose探测控件
  • 图像处理:Python使用OpenCV进行图像锐化 (非锐化掩模、拉普拉斯滤波器)
  • R调用Taxonkit展示系统发育信息
  • c++_0基础_讲解7 练习
  • C++中的中介者模式
  • 2.linux下的文件系统结构、磁盘管理以及常规操作
  • Excel中多条件判断公式怎么写?
  • Linux:基础IO(二.缓冲区、模拟一下缓冲区、详细讲解文件系统)
  • JS 中的深拷贝与浅拷贝
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Android系统模拟器绘制实现概述
  • angular2 简述
  • egg(89)--egg之redis的发布和订阅
  • ES6 学习笔记(一)let,const和解构赋值
  • IOS评论框不贴底(ios12新bug)
  • JAVA_NIO系列——Channel和Buffer详解
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Ruby 2.x 源代码分析:扩展 概述
  • SAP云平台里Global Account和Sub Account的关系
  • SpingCloudBus整合RabbitMQ
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 记一次用 NodeJs 实现模拟登录的思路
  • 力扣(LeetCode)22
  • 前端_面试
  • 如何设计一个比特币钱包服务
  • ionic异常记录
  • Java总结 - String - 这篇请使劲喷我
  • linux 淘宝开源监控工具tsar
  • python最赚钱的4个方向,你最心动的是哪个?
  • Semaphore
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • !$boo在php中什么意思,php前戏
  • # 数论-逆元
  • # 职场生活之道:善于团结
  • (C语言)fread与fwrite详解
  • (SpringBoot)第二章:Spring创建和使用
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (一)Dubbo快速入门、介绍、使用
  • (转)菜鸟学数据库(三)——存储过程
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ***监测系统的构建(chkrootkit )
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET 的程序集加载上下文
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架