借助BLE4.0来做手机APP与硬件设备的通信,与经典蓝牙的步骤是不一样的。下面详细介绍如何在编写一个与BLE设备通信的app。
APP对BLE的操作主要可分为四步:准备、搜索、连接、交互。
第一步:准备(请求权限和打开蓝牙)
这一步可分为三小步:声明权限,判断设备是否支持BLE,打开蓝牙
①声明权限
在AndroidManifest.xml文件下添加一下代码:
<!-- 获取蓝牙相关权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- 获取模糊定位权限,Android6.0以后使用蓝牙所需 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
android:protectionLevel="dangerous"/>
需要注意的是,我们不仅需要获取有关蓝牙的两个权限,还要请求一个模糊定位权限,这是Android6.0以上BLE搜索必需的权限。另外,由于定位权限属于危险权限,不但需要在Manifest.xml文件中添加,还要在代码中进行申请才可以,后面会提到如何申请定位权限并处理用户反馈结果。
②判断设备是否支持BLE
/* 判断本机设备是否支持BLE */
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, R.string.not_support, Toast.LENGTH_SHORT).show();
finish(); // 不支持就直接退出本页面
}
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
Toast.makeText(this, R.string.not_support, Toast.LENGTH_SHORT).show();
finish(); //不支持就直接退出本页面
}
其中,mBluetoothAdapter是BluetoothAdapter的实例,有两种实例化方式,一种是上述代码中的
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
另一种是通过BluetoothManager来得到
private BluetoothManager bluetoothManager;
bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
③打开蓝牙
打开蓝牙我们一般采用用户交互式的打开方式。
/* 以询问的方式,打开蓝牙 */
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
这里使用的是startActivityForResult来向用户询问是否打开蓝牙,并定义了一个final的常数量 REQUEST_ENABLE_BT作为请求标志位,即requestcode ,这个标志位是用来在onActivityResult方法中读取反馈时判断时什么请求,在下面会用到。
private final int REQUEST_ENABLE_BT = 1;
我们重写onActivityResult方法来获得用户的反馈
/**
* 系统自动回调函数,处理其他activity通信的返回结果
* @param requestCode:接收到的请求
* @param resultCode:用户做出的应答
* @param data:
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 接收到了打开蓝牙的请求,但是用户拒绝打开蓝牙
if (requestCode == RE