Android BLE 第三方传感器通用接入库。
ble-core- BLE 客户端 API 与默认生命周期实现sample-app- 扫描/连接/断开与事件观察集成示例
- 在 Android Studio 中打开项目 (Giraffe+ / AGP 8.5+)
- Sync Gradle
- 在设备/模拟器上运行
sample-app - 在示例页面操作:
扫描->连接->订阅演示特征/写入演示特征,观察事件日志
| Android 版本 | 所需权限 |
|---|---|
| Android 6-11 | ACCESS_FINE_LOCATION |
| Android 12+ | BLUETOOTH_SCAN + BLUETOOTH_CONNECT |
ACCESS_FINE_LOCATION:用于 BLE 扫描(Android 6-11)BLUETOOTH_SCAN:用于 BLE 扫描(Android 12+)BLUETOOTH_CONNECT:用于 BLE 连接(Android 12+)
- 当前
ble-core不内置权限申请器;调用前需由业务层先完成运行时权限申请。 - 权限声明见
sample-app/src/main/AndroidManifest.xml。 - 代码侧在以下位置默认“已具备权限”:
AndroidBleScanner.scan(...)(扫描)BleConnectionManager.connect(...)/setCharacteristicNotification(...)(连接与通知)
dependencies {
implementation(project(":ble-core"))
}val bleClient = BleClients.create(
context = applicationContext,
config = BleClientConfig(
connectTimeoutMs = 10_000,
writeTimeoutMs = 3_000,
maxRetry = 2
)
)// 观察连接状态
bleClient.connectionState.onEach { state ->
// 更新 UI
}.launchIn(lifecycleScope)
// 观察 BLE 事件
bleClient.events.onEach { event ->
// 处理事件
}.launchIn(lifecycleScope)lifecycleScope.launch {
bleClient.scan().collect { device ->
bleClient.connect(device)
}
}// 订阅通知
bleClient.subscribeCharacteristic(serviceUuid, characteristicUuid)
// 写入数据
val result = bleClient.writeCharacteristic(serviceUuid, characteristicUuid, payload)可能原因:
- 权限未授予
- 蓝牙未开启
- 定位未开启(Android 10 以下)
解决方案:
- 检查并申请权限
- 引导用户开启蓝牙
- 引导用户开启定位
可能原因:
- 设备不在范围内
- 设备已连接其他主机
- 服务/特征 UUID 不存在
解决方案:
- 确保设备在可连接范围内
- 断开设备与其他连接
- 检查服务 UUID
可能原因:
- 未连接
- 特征不支持写入
- 超时
解决方案:
- 先建立连接
- 检查特征属性
- 增加超时时间配置
- 先检查 Manifest 声明是否完整(见
sample-app/src/main/AndroidManifest.xml)。 - 再检查运行时是否已授予权限(Android 12-14:
BLUETOOTH_SCAN/BLUETOOTH_CONNECT;Android 6-11:ACCESS_FINE_LOCATION)。
val permissions = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
arrayOf(
android.Manifest.permission.BLUETOOTH_SCAN,
android.Manifest.permission.BLUETOOTH_CONNECT
)
} else {
arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION)
}
requestPermissionsLauncher.launch(permissions)当用户拒绝权限且勾选“不再询问”时,引导用户进入系统设置页手动授权。
| 错误码 | 说明 | 排查方向 |
|---|---|---|
| BLUETOOTH_UNAVAILABLE | 蓝牙不可用 | 检查设备是否支持蓝牙 |
| PERMISSION_DENIED | 权限被拒绝 | 检查权限是否授予 |
| SCAN_FAILED | 扫描失败 | 检查权限、蓝牙状态 |
| CONNECT_TIMEOUT | 连接超时 | 检查设备距离、重启设备 |
| NOT_CONNECTED | 未连接 | 先建立连接再操作 |
| WRITE_TIMEOUT | 写入超时 | 检查连接状态、重试 |
club.knifelf.ble.core.api 中的主要类型:
BleDevice:统一设备模型BleClient:入口接口(scan/connect/disconnect/write/subscribe)BleEvent:事件流封装(含CharacteristicChanged通知回流)ConnectionState:生命周期状态BleErrorCode+BleException:标准化错误表面BleClients.create(context, config):Android BLE 运行时客户端工厂
支持回调和 Flow 两种风格:
- Flow:
events,connectionState - Callback:
registerCallback,unregisterCallback
cd E:\MyTeam\AndroidSensorBle
.\gradlew.bat :ble-core:assembleDebug --stacktrace
.\gradlew.bat :sample-app:assembleDebug --stacktrace
.\gradlew.bat :ble-core:testDebugUnitTest --stacktrace- 示例运行路径:应用启动 ->
MainActivity->扫描->连接第一个设备->订阅演示特征/写入演示特征-> 观察事件日志 - 单元测试报告路径:
E:\MyTeam\AndroidSensorBle\ble-core\build\reports\tests\testDebugUnitTest\index.html
- 当提供
Context时,DefaultBleClient已接入 Android BLE 运行时 - GATT 操作编排支持:pending-op 队列、callback ACK、超时、重试、通知回调回流到
BleEvent.CharacteristicChanged BleClients.create(config)仍可用作非 Context 的本地/模拟集成
- 单元测试位于
ble-core/src/test - 覆盖范围:
- API 契约行为与状态转换
- 异常场景:未连接/连接超时/写入超时/订阅失败
- GATT 编排:pending 队列、ACK、超时重试
- 通知回调从 GATT 层回流到
BleEvent.CharacteristicChanged
- 决策:
ble-core是唯一的活跃交付模块。library标记为遗留兼容模块,将被弃用。 - 时间线:
- 2026-03-30:冻结
library新变更,所有新功能仅在ble-core中 - 2026-03-31:切换下游集成文档/脚本到
ble-core - 2026-04-02:集成确认后归档/移除
library
- 2026-03-30:冻结