Android 蓝牙开发
一、蓝牙版本介绍
蓝牙版本现在最新是蓝牙 5。在蓝牙4.0 提出了“低功耗蓝牙”、“经典蓝牙”和“高速蓝牙”三种。
低功耗蓝牙和经典蓝牙
现在的蓝牙实际上分为了三类:单模、双模和经典。那么,最官方的蓝牙版本称呼就是,单模蓝牙、双模蓝牙和经典蓝牙。
单模,也就是低功耗蓝牙,平常看到Bluetooth Smart、BLE就是指这个。
经典,就是经典蓝牙。
双模就是兼容低功耗蓝牙和经典蓝牙。平时看到的Bluetooth Smart Ready就是这个
Android 中的低功耗蓝牙
Android 4.3(API Level 18)开始引入Bluetooth Low Energy(BLE,低功耗蓝牙)的核心功能并提供了相应的API,应用程序通过这些api可以扫描设备、查询services,读写设备的characteristics(属性特征)。对比传统的蓝牙,BLE的设计能够显著减低功耗。这让Android应用程序与BLE设备之间的低功耗通讯成为可能,例如距离传感器、心率监视器、健身设备等等。
这个蓝牙标准和经典蓝牙区别极大,在最初甚至考虑过加入WIFI阵营,但是因为蓝牙阵营这边条件较为优厚(比如授权费用极低)才并入了蓝牙标准。
二、蓝牙开发:
低功耗蓝牙和经典蓝牙的区别究竟在哪里呢?
要是仅仅从两者的通信方式上来说,可以说除了名字叫蓝牙外,完全可以当做两个东西。这也就为很多搞过经典蓝牙以为就可以很轻松的接着搞低功耗蓝牙的人埋下了一个大坑。
不过,两者在总体上的流程却也是相似的,那就是:发现设备->建立连接->数据通信
下面分别介绍经典蓝牙和低功耗蓝牙的开发过程:
2.1、经典蓝牙
蓝牙官方文档
经典蓝牙设备发现其它经典蓝牙设备的方式是调用BluetoothAdapter的startDiscovery()
方法,这个方法只能够发现经典蓝牙设备。
2.2、低功耗蓝牙
Android 4.3
针对具有低功耗要求的蓝牙设备,Android 4.3(API 级别 18)中引入了面向低功耗蓝牙的 API 支持。Android 4.3 支持扫描出低功耗的蓝牙,但是自身扫描使用的不是低功耗
Bluetooth Low Energy官方文档 的翻译:Android Bluetooth Low Energy(Android低功耗蓝牙)
BluetoothAdapter官方文档
Android 5.0
在Android 5.0 API 21 引入了BluetoothLeScanner,是用来进行自身的低功耗扫描,扫描出周围的低功耗蓝牙
Android 6.0
改进的蓝牙低功耗扫描,在android 5.0基础上对扫描周围低功耗蓝牙进行了改进。
如果您的应用执行蓝牙低功耗扫描,可以使用新增的 setCallbackType() 方法指定您只希望在下列条件下通知回调:首次找到与设置的 ScanFilter 匹配的播发数据包,或者已过很长时间后才再次看到该数据包。这种扫描方法与旧平台版本中提供的方法相比更加节能。
Android 6.0 API
这篇文章的实战型更强,Android 蓝牙4.0 BLE (onServicesDiscovered 返回 status 是 129,133时)
发现设备
低功耗蓝牙中则有一个主设备(Central)和从设备(Peripheral,也叫外围设备)的概念。
通过BluetoothAdapter的startLeScan()
方法实现。从设备则作为被发现方,发出广播,以供发现。
同样,这个startLeScan()方法只能发现低功耗蓝牙从设备。
不过,在Android系统蓝牙搜索界面,两种蓝牙设备都是可以被发现的。只有当蓝牙设备与某设备建立连接后,才不会再被扫描到。
三、蓝牙扫描问题
蓝牙扫描问题,在Android 6.0运行API 23的app
有的小伙伴遇到在Android 6.0搜索不到蓝牙设备,大多就是这个问题。
targetApi 为23的APP(及以上)运行在Android 6.0(及以上的)系统上,在扫描蓝牙的时候需要Location的权限。否则会报下面的警告,导致扫描不到周围的蓝牙设备:
W/Binder: Caught a RuntimeException from the binder stub implementation.java.lang.SecurityException: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan resultsat android.os.Parcel.readException(Parcel.java:1684)at android.os.Parcel.readException(Parcel.java:1637)at android.bluetooth.IBluetoothGatt$Stub$Proxy.startScan(IBluetoothGatt.java:696)at android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper.onClientRegistered(BluetoothLeScanner.java:374)at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:56)at android.os.Binder.execTransact(Binder.java:565)
三种解决办法:
1、赋予权限,android 6.0 需要AndroidManifest.xml中声明权限和动态申请权限(如果权限是危险权限)
2、更改targetApi 小于23
3、运行在Android 6.0 以下系统
参考:
蓝牙
Android6.0以上系统搜索不到 蓝牙BLE 设备问题
Android中经典蓝牙与低功耗蓝牙的简单对比分析
android 蓝牙5.0初探之低功耗扫描
这篇文章中的瑕疵:1、低功耗扫描不是蓝牙5的特性,是Android 5.0的特性。2、更准确一点说是蓝牙5,而不是蓝牙5.0
蓝牙协议详解
关注我的公众号,轻松了解和学习更多技术
Android 蓝牙开发相关推荐
- Android 蓝牙开发,申请打开蓝牙
申请打开蓝牙 <!-- 蓝牙权限 --> <uses-permission android:name="android.permission.BLUETOOTH" ...
- android蓝牙聊天设备,Android蓝牙开发——实现蓝牙聊天
最近课上刚好需要做一个课程设计关于蓝牙的就挑选了个蓝牙聊天室,其实关键还是在于对蓝牙API的了解 一.蓝牙API 与蓝牙开发主要的相关类是以下四个 BluetoothAdapter 字面上则理解为蓝牙 ...
- Android蓝牙开发系列文章-蓝牙设备类型知多少?
在写<Android蓝牙开发系列文章-蓝牙音箱连接>时,计划细化出一篇讲解蓝牙设备类型的文章,现在它来了~ 阅读其他内容,可以点击<Android蓝牙开发系列文章-策划篇>,或 ...
- Android蓝牙开发(一)之打开蓝牙和设备搜索
Android蓝牙开发系列目录: https://blog.csdn.net/huangliniqng/article/details/82185635 一.判断是否系统是否支持蓝牙 在使用蓝牙之前, ...
- Android蓝牙开发系列文章-蓝牙mesh(一)
在<Android蓝牙开发系列文章-策划篇>中我们对蓝牙专题的内容进行整体规划,现在让我们一点点揭开他的面纱~ 本文是关于蓝牙mesh的首篇文章,由好友CSDN博主yk150915提供,在 ...
- Android蓝牙开发 — 经典蓝牙BLE蓝牙
一,前期基础知识储备 1)蓝牙是一种支持设备之间短距离通信的无线电技术(其他还包括红外,WIFI): 支持移动电话.笔记本电脑.无线耳机等设备之间进行信息的交换: Android支持的蓝牙协议栈:Bl ...
- Android 蓝牙开发(扫描设备、绑定、解绑)Kotlin版
Kotlin版 蓝牙开发 (扫描设备.绑定.解绑) 前言 运行效果图 正文 ① 配置项目 ② 布局和样式 ③ 编码 1. 通知栏样式修改 2. 蓝牙设备列表适配器编写 3. 权限请求 4. 初始化蓝牙 ...
- Android 蓝牙开发(扫描设备、绑定、解绑)
Android 蓝牙开发(扫描设备.绑定.解绑) 前言 效果图 一.配置项目 二.布局和样式 三.编码 四.源码 前言 公司最近给我丢了一个蓝牙开发的项目,不了解怎么办呢,那当然是从最基础的开始了,所 ...
- Android 蓝牙开发(一) -- 传统蓝牙聊天室
Android 蓝牙开发(一) – 传统蓝牙聊天室 Android 蓝牙开发(三) – 低功耗蓝牙开发 项目工程BluetoothDemo 一.蓝牙概览 以下是蓝牙的介绍,来自维基百科: 蓝牙(英语: ...
- Android蓝牙开发教程(二)——连接蓝牙设备
在上一篇中已经介绍如何搜索附近可连接的蓝牙设备,如果你还没阅读过,建议先看看上一篇文章Android蓝牙开发教程(一)--搜索蓝牙设备 获取到设备后就可以开始处理蓝牙设备之间的连接. 在上一篇教程中我 ...
最新文章
- 这本1900页的机器学习数学全书火了!完整版开放下载
- shell删除最后一行、删除第一行、比较文件
- 电子计算机场地通用规范_最全的视频监控系统施工规范要求
- 这几家5月还在急招.NET,都是30k以上!
- 【机器学习】 - 激活函数与交叉熵Sigmoid, Softmax, binary_crossentropy, categorican_crossentropy区别
- DataSet.GetBookMark内存泄漏
- Launcher分析修改记录(1)----序
- 中国大学50强排行:北大清华复旦位列三甲
- NS 2.35 柯志亨书-实验9笔记-队列管理机制
- Linux bash shell递归函数
- 并发编程学习之Condition和顺序访问
- JBoss中间件漏洞总结
- linux系统压缩zip,linux系统压缩zip命令详解
- 计算机显示不支持此接口,为什么会提示“不支持此接口”?提示不支持此接口的解决方法...
- php eval $ post,网站多了几个PHP文件,eval($_POST['1']);
- 批量识别条形码和二维码
- 系统学习SSH(一)--SSH
- android智能电灯,爱克 E-Light(智能灯泡)apk
- matlab 打包封装,matlab中如何封装打包成exe文件
- WPS Office 2019 上架微软商城,全新可定制 UI
热门文章
- 如何选性价比高的笔记本电脑,戴尔灵越16 Plus怎么样?
- 小程序拼团,分销逻辑
- 1001: 植树问题 Java
- 告诉你,什么是UML?
- BiasFinder: Metamorphic Test Generation to Uncover Bias for Sentiment Analysis Systems阅读
- Stanford CS107 Programming Paradigms 编程范式 课程笔记
- 377招募线上被试 | 大学生心理健康与应对方式的关系
- 【旧文档2016年】一种提升黑屏手势响应速度的方法
- 24小时精通网上开店与赚钱 pdf电子书
- 课堂笔记(7) Model fit and variable selection 模型拟合和变量选择 —— Adjusted ​R^2、Cp、全子集回归