Android Connectivity学习笔记–Bluetooth
1. 应用场景
- 设备近距离传递数据的一种方式,无需通过网络连接,节省流量
- 数据交换方便,理论上可传输任意类型数据
2. 使用流程
(1) 权限声明
首先必须打开的是android.permission.BLUETOOTH
权限,如果同时要将此应用做服务端使用(即监听客户端的连接),则同时应打开android.permission.BLUETOOTH_ADMIN
权限(一般应用都需要实现这个功能),如下:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
同时蓝牙要在有效区域内才工作,因此需要位置权限,如下:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
这两个是危险权限,在Android 6.0
以上的设备上需要做运行时权限的申请(此处省略)。
(2) 基本操作
在两个设备连接之前有一些基本操作需要完成,比如:查看设备是否支持蓝牙、打开蓝牙、查看已配对设备、扫描周围设备等。
android.bluetooth.BluetoothAdapter
是蓝牙API重要的类,大多数蓝牙相关的操作都通过BluetoothAdapter
来完成,通过其静态方法getDefaultAdapter()
来获得BluetoothAdapter
单例:
private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
查看设备是否支持蓝牙
通过是否获取到BluetoothAdapter
单例可以判断出设备是否支持蓝牙,对于某些不支持蓝牙的设备,通过getDefaultAdapter()
获取的BluetoothAdapter
对象为null
:
if (mBluetoothAdapter == null) {
// 说明设备不支持使用蓝牙
return;
}else{
// 设备支持使用蓝牙
}
查看开启状态并打开蓝牙
通过BluetoothAdapter
的isEnabled()
方法判断当前设备是否已经打开蓝牙,该方法返回true
则表示蓝牙已经打开,返回false
表示蓝牙处于关闭状态。
打开蓝牙有两种方式,一种是用户手动进入设置界面打开蓝牙,这样的用户体验不好。另一种是应用通过启动一个系统Activity
完成在应用内开启蓝牙的操作,这样可以避免用户在系统设置和应用之间切换,此时需要指定Intent
的action
为BluetoothAdapter.ACTION_REQUEST_ENABLE
,如下:
if(mBluetoothAdapter.isEnabled()){
// 蓝牙已经开启
}else{
// 蓝牙设备未开启,引导用户开启
Intent intent = new Intent();
intent.setAction(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, ENABLE_BLUETOOTH_REQUEST_CODE);
}
为获取开启结果,需使用startActivityForResult(Intent, int)
方法来启动该Activity
,然后在onActivityResult(int, int, Intent)
中获取开启结果。当且仅当resultCode == RESULT_OK
时才说明蓝牙开启成功,如下:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ENABLE_BLUETOOTH_REQUEST_CODE){
if(resultCode == RESULT_OK){
// 说明蓝牙已经成功开启,这时广播接收器会收到通知,因此不需要在这里处理
}else{
// 蓝牙未成功开启,可能是用户取消了开启,或者开启过程中遇到异常
}
}
}
系统在蓝牙的工作状态发生变化时会发出action
为的BluetoothAdapter.ACTION_STATE_CHANGED
的Broadcast
通知应用,因此可以注册相应的BroadcastReceiver
来接收。其中intent
携带的BluetoothAdapter.EXTRA_STATE
为变化后蓝牙的工作状态,BluetoothAdapter.EXTRA_PREVIOUS_STATE
为变化前蓝牙的工