BLE Android 应用 开发
1.权限设置
<uses-feature android:name="android.hardware.location.gps" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
这里有人可能疑惑,使用蓝牙为啥要定位权限,其实蓝牙技术是可以实现定位的,要使用蓝牙必须要申请定位权限,android 9 之后动态权限申请
private void checkPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
int fine_location = checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION);
int cross_location = checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION);
if (fine_location != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 1);
} else {
finish();
return;
}
if (cross_location != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
} else {
finish();
return;
}
}
}
动态申请,提示的是申请定位权限,这点个不要奇怪。
2.获取蓝牙设备管理器
private void getBleAdapter() {
if (mAdapter != null) {
return;
}
BluetoothManager bluetoothManager =
(BluetoothManager) context.getSystemService (Context.BLUETOOTH_SERVICE);
mAdapter = bluetoothManager.getAdapter ();
}
这里获取到的是一个蓝牙适配器BluetoothAdapter ,后续通过适配器调用蓝牙适配器。
3.设备搜索
mAdapter.startLeScan (leScanCallback);
BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback () {
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
//device.getName() 设备名称
//device.getAddress() mac地址
}
};
这个搜索方法在21 已经过期了后续使用
mAdapter.getBluetoothLeScanner ().startScan (new ScanCallback () {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult (callbackType, result);
// BluetoothDevice device= result.getDevice (); 获取设备对象
// result.getRssi () 信号强度,根据这个可以计算出距离服务端蓝牙的距离
}
});
3.1 停止搜索
mAdapter.stopLeScan (leScanCallback);
同样这个方法21后过期了,可以使用新的api
mAdapter.getBluetoothLeScanner ().stopScan(// 搜索接口实例);
在搜到合适设备或者想停止设备搜索时可以调用这个api停止搜索。
- 注意:如果去连接设备时,同时还在搜索设备,建议先调用stopScan 停止搜索,然后再连接,这样可以提高效率。
4.设备连接
一般情况下,根据业务不同有可能我们会将搜索到的BluetoothDevice 保存下来。
再次使用时可以用
BluetoothDevice device = mAdapter.getRemoteDevice (deviceInfo.getAddress ());
如果device 是空的,说明设备可能已经关闭了,后边就没必要链接了