Android BLE開發(fā)中踩過的坑

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)致連接不能斷開

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容