Flutter开发中TapKey Mobile SDK无法检测蓝牙锁问题求助
问题排查与解决方案
一、BLE锁扫描不到的问题
你当前的代码和流程存在几个关键疏漏,逐一排查:
1. 未主动启动BLE扫描
你的scanLocks()方法仅监听了locksChangedObservable,但没有调用TapKey SDK的启动扫描接口。TapKey的BleLockScanner需要主动触发扫描操作才会开始检测附近的锁,将以下代码添加到权限通过的分支中:
// 启动BLE扫描,用取消令牌控制扫描生命周期 val scanCts = CancellationTokenSource() tapkeyServiceFactory.bleLockScanner.startScanAsync(scanCts.token) .catchOnUi { error -> println("扫描启动失败: ${error.cause}") }
注意在不需要扫描时调用scanCts.cancel()停止扫描,避免资源浪费。
2. 权限申请逻辑缺失
你的代码仅检查权限,但未在权限未授予时触发运行时权限申请。若用户未授权蓝牙权限,扫描逻辑会直接返回,无法触发权限弹窗。修改权限检查分支:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) { // 触发权限申请弹窗 ActivityCompat.requestPermissions( this, arrayOf(Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT), 1001 // 自定义请求码 ) return } else { // 启动扫描+监听逻辑 val scanCts = CancellationTokenSource() tapkeyServiceFactory.bleLockScanner.startScanAsync(scanCts.token) .catchOnUi { error -> println("扫描启动失败: ${error.cause}") } tapkeyServiceFactory.bleLockScanner.locksChangedObservable .addObserver { locks -> println("检测到锁: $locks") } println("当前已发现锁: ${tapkeyServiceFactory.bleLockScanner.locks}") println("Permission granted") }
若需要兼容Android 11及以下版本,还需添加ACCESS_FINE_LOCATION权限到AndroidManifest.xml,并在申请时包含该权限。
3. 锁的权限未分配给目标用户
你提到Client Credentials创建的用户被分配了锁权限,但通过Token Exchange登录的是云函数创建的新用户——这是两个独立的用户实体。请确认:
- 云函数创建的用户是否被添加到锁的授权列表中
- 是否通过TapKey API为该用户分配了锁的访问权限(例如调用
/Locks/{lockId}/Authorizations接口)
4. 锁的状态验证
确认锁本身处于可连接状态:
- 锁已完成激活流程
- 锁电量充足(低电量可能关闭BLE广播)
- 锁未处于休眠或锁定状态
二、找不到云函数创建的用户的问题
通过Owners/{ownerAccountId}/IdentityProviders/{ipId}/Users路径创建的用户属于自定义身份提供商下的用户,在my.tapkey.com后台的默认用户列表中不会直接显示。你可以通过以下方式查看:
- 调用TapKey Management API的
/Owners/{ownerAccountId}/IdentityProviders/{ipId}/Users接口,查询该身份提供商下的所有用户 - 若需要在后台可视化查看,需为该用户添加联系人信息(姓名、邮箱等),添加后用户会出现在后台的用户列表中
内容的提问来源于stack exchange,提问作者czapelM
相关产品推荐
相关产品推荐

