目录
正文
Android 平台包含蓝牙网络堆栈支持,凭借此项支持,设备能以无线方式与其他蓝牙设备交换数据。应用框架提供了通过 Android Bluetooth API 访问蓝牙功能的途径。 这些 API 允许应用以无线方式连接到其他蓝牙设备,从而实现点到点和多点无线功能。
Android 4.3(API 级别 18)之后,Android引入了面向低功耗蓝牙(Bluetooth Low Energy,简称 BLE)的 API 支持。与传统蓝牙相比,低功耗蓝牙(BLE)设计目的是降低功耗。这就使得Android的应用可以(通过BLE)与具有更严格的电量要求的设备进行通信,比如近距离传感器、心率监测器和健身设备等。
本文主要介绍如何使用传统蓝牙,关于低功耗蓝牙(BLE)的技术与实现将在后面的章节中讲解。
使用Bluetooth API能实现的功能
- 扫描其他蓝牙设备
- 查询本地蓝牙适配器的配对蓝牙设备
- 建立 RFCOMM 通道
- 通过服务发现连接到其他设备
- 与其他设备进行双向数据传输
- 管理多个连接
发现和连接周围的蓝牙设备
开发和使用蓝牙功能一般会遵循以下步骤:
1. 声明蓝牙权限
2. 检验及启动蓝牙
3. 扫描附近蓝牙设备
4. 获取已配对蓝牙设备列表(进行UI展示)
5. 连接指定的蓝牙设备
6. 管理多个连接
接下来我们按照以上步骤讲解蓝牙功能的开发。
1. 声明蓝牙权限
要在应用中使用蓝牙功能,必须在Manifest文件中声明蓝牙权限。
Android中可以声明的蓝牙权限有两个, BlUETOOTH 和 BLUETOOTH_ADMIN:
- BLUETOOTH 权限:允许应用连接已配对的设备。
- BLUETOOTH_ADMIN 权限:允许应用发现和配对蓝牙设备。( 注:如果要使用 BLUETOOTH_ADMIN 权限,则还必须拥有 BLUETOOTH 权限。)
在Manifest中声明蓝牙权限:
<manifest ... >
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
...
</manifest>
2.检验及启动蓝牙
在应用中使用蓝牙功能之前,需要先检验设备是否支持蓝牙。如果设备支持蓝牙设备,则应该停用应用中任何蓝牙功能。如果设备支持蓝牙,但已关闭蓝牙功能,则可以请求用户在不离开应用的同时启用蓝牙功能。
2.1. 检验设备是否支持蓝牙
检验设备是否支持蓝牙的方法,通过调用 BluetoothAdapter 的静态方法 getDefaultAdapter() 方法来判断,如果设备支持蓝牙功能,将返回一个表示设备自身的蓝牙适配器的 BluetoothAdapter;如果设备不支持蓝牙功能,getDefaultAdapter() 方法将返回 null 。
示例代码:
BluetoothAdapter adapter= BluetoothAdapter.getDefaultAdapter();
if(adapter == null){
//设备不支持蓝牙设备,应停用所有的蓝牙功能。
return;
}
2.2. 启动蓝牙功能
下一步,还需要确保已经启用蓝牙功能。调用 BluetoothAdapter 的 isEnabled() 方法来检查是否已启用蓝牙功能。如果此方法返回false,则表示蓝牙功能处于关闭状态。要请求开启蓝牙,可以使用 ACTION_REQUEST_ENABLE 创建Intent,并调用 startActivityForResult() 方法来请求开启,这种方式无需退出或停用应用即可通过设置发出启用蓝牙功能的请求。
示例代码:
//检查蓝牙功能是否开启
if(!adapter.isEnabled()){
//请求启动蓝牙功能(无需退出或者停用应用)
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
//注意:传递给startActivityForResult()的REQ_ENABLE_BLUETOOTH常量
//是局部定义的整形,且必须大于0
startActivityForResult(intent, REQ_ENABLE_BLUETOOTH);
}
如下图所示,将显示请求用户启用蓝牙功能的对话框,如果用户响应“YES”,系统将开始启动蓝牙,并在该进程完成(或失败)后返回到应用。
如果蓝牙功能开启成功的话,Activity将会在 onActivityResult() 回调中收到 RESULT_OK 结果代码;如果用户响应“No”而没有启用蓝牙,则结果代码是 RESULT_CANCELED 。
示例代码:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case REQ_ENABLE_BLUETOOTH:{
if (resultCode == RESULT_OK){
//蓝牙功能开启成功,可以扫描附近的蓝牙设备了。
}else{
//蓝牙功能开启失败,应停用应用的蓝牙功能。
}
}
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
另外应用还可以选择监听 ACTION_STATE_CHANGED 广播Intent,每当蓝牙状态发生变化时,系统都会广播这个Intent。这个广播包含额外的字段 EXTRA_STATE 和 EXTRA_PREVIOUS_STATE,两者分别包含新的和旧的的蓝牙状态。
广播的Intent中可能还会包含其他字段:
- STATE_TURNING_ON
- STATE__ON
- STATE_TURNING_OFF
- STATE_OFF