Android在4.3中引入了對BLE的支持,BLE基本使用方法請參考Android BLE開發(fā)入門
以下是我在BLE開發(fā)中遇到的坑:
數(shù)據(jù)長度
BLE的特征一次讀寫最大長度20字節(jié)。異步問題
讀寫Characteristic、Descriptor等幾乎所有BLE操作結(jié)果都為異步返回,若不等待上一次操作結(jié)果返回就執(zhí)行下一次操作,很可能導(dǎo)致操作失敗或者操作無效。onDescriptorWrite()返回的線程與寫入線程為同一個線程,別的操作一般在不同的線程回調(diào)。設(shè)備緩存
Android會對連接過的BLE設(shè)備的Services進(jìn)行緩存,若設(shè)備升級后Services等有改動,則程序會出現(xiàn)通訊失敗。此時就得刷新緩存,但是刷新緩存的方法并沒有開放,這里只能使用反射來調(diào)用BluetoothGatt類中的refresh()方法:
try {
Method localMethod = mBluetoothGatt.getClass().getMethod("refresh");
if (localMethod != null) {
return (Boolean) localMethod.invoke(mBluetoothGatt);
}
} catch (Exception localException) {
Log.e("refreshServices()", "An exception occured while refreshing device");
}
掃描設(shè)備
startLeScan(UUID[], BluetoothAdapter.LeScanCallback)在Android4.4及以下手機(jī)中似乎只支持16位的短UUID,不支持128位完整的UUID。藍(lán)牙回調(diào)
安卓4.4的藍(lán)牙回調(diào)是在異步線程中(不在主線程),若要在藍(lán)牙回調(diào)中執(zhí)行更新界面的操作,記得切換到主線程去操作三星手機(jī)兼容性問題
connectGatt()方法在某些三星手機(jī)上只能在UI線程調(diào)用。Android L 新API
Android L換了一套掃描設(shè)備的API:BluetoothLeScanner.startScan(List, ScanSettings, ScanCallback)Android M新的權(quán)限
Android M中必須擁有定位權(quán)限才能掃描BLE設(shè)備連接不斷開的問題
別的BLE程序非法保留連接的設(shè)備可能會導(dǎo)致連接不能斷開