问题与解决的记录:
- 扫描广播包时,尽量增加过滤信息。
ScanFilter filter = new ScanFilter.Builder()
.setDeviceName("设备名")
.setServiceUuid(new ParcelUuid(UUID.fromString("设备服务UUID")))
.setDeviceAddress("设备mac地址")
.build();
如果不添加过滤信息而采用在onScanResults(BluetoothDevice device, int rssi, byte[] scanRecord) 回调方法中判断是否连接设备,当周围有很多蓝牙设备同时广播时,有可能会因为系统底层处理速度跟不上而造成目标设备无法及时被扫描到。
另外关于setDeviceAddress(),某些版本华为手机不支持此方法,虽然可以通过编译,但无法获得任何扫描结果。
- 蓝牙断开后需要执行bluetoothGatt.close()关闭gatt连接。
private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
Log.i(TAG, "Connect state change: old:" + status + " new:" + newState);
if (newState == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "Connected to GATT server.");
// Attempts to discover services after successful connection.
Log.i(TAG, "Attempting to start service discovery:");
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.i(TAG, "Disconnected from GATT server.");
mBluetoothGatt.close();
}
}
}
- 不可重复调用建立Gatt通讯连接的方法,否则所有回调方法都会被调用多次,影响程序内部的状态。如果不确定是否已经建立连接,可用如下方法判断:
/**
* 是否已经建立蓝牙连接
* @param context 上下文
* @param address 设备mac地址
* @return 已经连接返回true
*/
private boolean isConnected(Context context, String address){
BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
return bluetoothManager.getConnectionState(device,BluetoothProfile.GATT) == BluetoothProfile.STATE_CONNECTED;
}
网友评论