Delphi 10.2.2 Tokyo Android平台BLE服务无法显示问题求助
嘿,这个问题我之前帮不少开发者排查过,Delphi 10.2.2在Android上运行BLE应用确实有几个容易忽略的关键点,尤其是服务发现这块,给你列几个核心的设置和排查方向:
必须补全的Android权限(静态+动态)
Android 6.0(API 23)及以上版本对BLE扫描强制要求位置权限,这是很多人踩坑的地方。首先要确保你的项目AndroidManifest.xml里添加了以下权限:<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />光加静态权限还不够,还要在代码里动态申请位置权限——示例项目大概率没做这个。你可以在启动扫描前添加权限检查逻辑,比如:
uses System.Permissions; procedure TForm1.ButtonScanClick(Sender: TObject); begin PermissionsService.RequestPermissions([ACCESS_FINE_LOCATION], procedure(const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>) begin if AGrantResults[0] = TPermissionStatus.Granted then BLEManager1.StartScan else ShowMessage('需要位置权限才能扫描BLE设备'); end); end;调整服务发现的时机
示例里的代码可能在设备刚连接就立刻调用DiscoverServices,但Android上BLE连接需要短暂的初始化时间,直接调用会导致服务发现失败。你需要把服务发现的逻辑移到TBLEDevice的OnConnected事件里,比如:procedure TForm1.BLEDeviceConnected(Sender: TObject); var LDevice: TBLEDevice; begin LDevice := Sender as TBLEDevice; LDevice.DiscoverServices; end;同时确保你已经正确绑定了
OnServicesDiscovered事件,在这个事件里去遍历并显示服务列表。排查Delphi 10.2.2的BLE组件bug
这个版本的TBLEManager和TBLEDevice存在一些已知的服务发现问题,比如OnServicesDiscovered事件可能不会触发。如果遇到这种情况,可以尝试在调用DiscoverServices后延迟1-2秒,手动遍历TBLEDevice.Services集合来获取服务信息;另外,有些BLE设备只允许指定UUID的服务发现,你可以试试在DiscoverServices里传入目标服务的UUID数组,而不是默认的空数组(即发现全部服务)。Android系统版本适配补充
如果你的设备是Android 8.0(API 26)及以上,还需要额外添加BLUETOOTH_SCAN和BLUETOOTH_CONNECT权限(虽然Delphi 10.2.2原生不支持,但可以手动在Manifest里添加),不过这个版本的Delphi对高版本Android的BLE支持有限,优先处理前面的权限和时机问题。
按照这几个步骤排查,应该就能解决服务无法显示的问题了。
内容的提问来源于stack exchange,提问作者wBB

