Android 低功耗蓝牙开发(扫描、连接)
前言
之前我写过蓝牙开发的文章,只不过是针对于经典蓝牙,可以理解为普通蓝牙,连接的对象是经典蓝牙,列如手机蓝牙、蓝牙耳机等设备。而也有读者说在学习低功耗蓝牙,因此就有了这篇文章,一方面是为了丰富蓝牙的使用,一方面也是为了帮助看我文章的读者,我会讲的很细,很多人也说我在记流水账,不过这不重要,重要的是你从流水账里学到了什么。
正文
首先明白低功耗蓝牙是什么?
蓝牙低能耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart)也称低功耗蓝牙,是蓝牙技术联盟设计和销售的一种个人局域网技术,旨在用于医疗保健、运动健身、信标、安防、家庭娱乐等领域的新兴应用。相较经典蓝牙,低功耗蓝牙旨在保持同等通信范围的同时显著降低功耗和成本。
效果图如下:
概念已经了解了,下面创建一个名为BleDemo的项目来写这篇文章。
一、项目配置
首先进行项目的配置,一个是build.gradle配置,一个是AndroidManifest.xml配置。
先进行项目的build.gradle的配置,添加jitpack仓库。
再进行app的build.gradle的配置,这里需要添加几个依赖库,
改完了build.gradle记得要Sync Now。
这个库是Nordic公司开发的,在蓝牙领域很出名的公司。这个版本是适配androidx的,一般现在创建新项目都是默认支持androidx的,不支持的话就说明你的AS该更新了。如果要支持support请到GitHub上去适配。其他的库或多或少都有接触过就不介绍了。
下面配置AndroidManifest.xml。
添加位置如下图所示
在Android 6.0以后的系统BLE scan需要申请location的相关权限才能支持BLE的一些功能,比如发现附近的beacons设备。
这是开发的时候必须用到的权限,并非权限滥用。而在Android6.0以后则有了动态权限的申请,这里就说明一下等下为是什么要请求定位权限,后面就不要问我为什么扫描一个蓝牙还要打开定位权限这样的问题了。
二、权限请求
这里主要是定位权限的请求,还有就是获得定位之后,蓝牙是否有打开也需要进行处理,下面进行具体的编码。
在MainActivity中新增一个方法,代码如下:
这里进行Android版本的判断,6.0及以上则请求权限,6.0一下则判断蓝牙是否打开。
下面先写这个蓝牙是否打开的判断
这里会有一个页面的返回结果,代码如下:
那么现在对于蓝牙是否打开的结果进行了处理,下面进行动态权限的请求。
这里会检查权限,有权限检查有没有打开蓝牙,没有权限则请求权限,请求权限的结果代码如下:
这个结果会通过@AfterPermissionGranted注解将结果返回给这个requestPermission方法,然后重新检查权限结果。下面只要在checkAndroidVersion中调用这个requestPermission()方法和openBluetooth()方法即可,如下图所示:
现在就形成了一个逻辑链,不过还需要一个地方去调用这个checkAndroidVersion()方法,就直接在onCreate中调用吧。
继续下一步。
三、扫描低功耗蓝牙
扫描低功耗蓝牙,首先要有触发的地方,其次要有显示结果的地方,这些都需要进行UI的处理,那么下面进行布局的修改和增加,修改activity_main.xml,代码如下:
下面进行列表item的布局编写,在layout下新建一个item_device_rv.xml文件,文件代码如下:
这里面有一个图标,使用路径绘制的ic_bluetooth_blue.xml,放在drawable文件夹下,代码如下:
好了,现在针对于这个布局方面的内容告一段落,下面先运行一下了:
进行下一步操作。
先进行页面的初始化。新增一个initView的方法。
这个initView主要是页面的初始化,列表在后面进行配置,根据扫描结果来定,然后就是配置扫描回调,这里注意导包的问题,不要到错了包。
然后还有一个开始扫描和停止扫描的方法。
下面在onCreate方法中调用initView()方法。
下面就可以开始运行了。运行之后点击开始扫描按钮,就会扫描附近的低功耗蓝牙设备,(请在附近有已打开低功耗蓝牙时进行扫描)可以在日志栏处进行打印。
这里很明显,扫描到了一些蓝牙设备,并且很多设备没有设备名称。既然有了结果,那么下面就是将扫描到的结果显示在列表上,这样才更直观。
四、显示扫描设备
下面将扫描结果渲染到列表上,首先明确列表要显示扫描设备的那些信息,从item来看有设备名、Mac地址、信号强度。那么可以根据这一个扫描的信息构建一个设备类,新建一个BleDevice类,代码如下:
下面来写这个适配器,新建一个BleDeviceAdapter类,代码如下:
下面回到MainActivity中对列表进行适配,先定义变量
然后在initView方法中进行列表配置,代码如下:
添加位置如下:
下面就是将扫描结果添加到列表中了,可以写一个方法addDeviceList(),代码如下:
然后在扫描的回调中进行调用即可。
点击开始的时候清理一下列表。
下面运行一下:
增加一个表示搜索的效果,在activity_main.xml中增加
然后这个进度条设置在列表的上面。
回到MainActivity,创建变量:
绑定视图
控制视图
运行一下:
五、连接设备
连接Ble设备其实也很简单,难的是连接之外的东西,先来构想一下连接功能的业务逻辑,点击设备列表中的设备,进行连接,先显示一个加载布局,表示现在正在连接,然后停止扫描,在根据设备的mac地址去连接这个设备,然后在连接设备的回调中处理连接设备的结果。嗯,就是这样。下面来编码,首先是加载布局的问题。在activity_main.xml中增加如下布局代码:
添加位置如下图
然后在MainActivity中创建变量
绑定视图
下面新增一个方法,用来连接设备。在点击设备列表Item的时候调用。
在initView()中设置列表点击。
OK,下面运行一下:
这个布局背景是白色的不是很明显,改一下好了。在drawable文件夹下新建一个shape_loading_bg.xml,里面的代码如下:
然后设置到这个布局中
运行看看
嗯,还可以,就这样了。
有连接设备就自然有断开连接设备。再增加两个变量
修改connectDevice()中的代码,如下图所示
再新建一个断开连接的方法,代码如下:
六、源码
源码地址Github:BleDemo