Android蓝牙错误133
我正在尝试连接到Android上的蓝牙设备。 我在onClientConnectionState
处理程序中收到状态133。 我并不总是得到这个错误 – 有时连接很好。 我无法指出触发问题的原因。 重新启动设备和我的repro应用程序后,我甚至立即拥有它。
我知道几个问题,并建议解决这个问题,包括(从这里 , 这里 , 这里 ):
- 将UI线程用于所有BT API
- 务必在完成后关闭关贸总协定
但我正在做这一切。 更重要的是,我的设备是一个Nexus 5(运行Lollipop),根据一些人甚至不需要BT交互在UI线程上。
我把最简单的复制品放在了一起。 它在C#中,但Java等价物应该是显而易见的:
[Activity(Label = "BluetoothGatt133ErrorRepro", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity { protected override void OnCreate(Android.OS.Bundle bundle) { base.OnCreate(bundle); SetContentView(Resource.Layout.Main); var button = FindViewById
这是运行它的输出(我已经离开了Android的BluetoothGatt源的输出):
***** #1 Beginning ***** #1 Starting scan 07-01 11:53:21.458 D/BluetoothLeScanner(10377): onClientRegistered() - status=0 clientIf=5 ***** #1 Got device: elided ***** #1 Connecting GATT 07-01 11:53:22.833 D/BluetoothGatt(10377): connect() - device: 00:00:DE:AD:BE:EF, auto: true 07-01 11:53:22.833 D/BluetoothGatt(10377): registerApp() 07-01 11:53:22.833 D/BluetoothGatt(10377): registerApp() - UUID=fa5bce8a-416d-47fe-9a8a-e44156f7e865 07-01 11:53:22.834 D/BluetoothGatt(10377): onClientRegistered() - status=0 clientIf=6 07-01 11:53:24.622 D/BluetoothGatt(10377): onClientConnectionState() - status=133 clientIf=6 device=00:00:DE:AD:BE:EF ***** #4 Connection state changed to Disconnected with status 133. ***** #1 Disconnecting GATT 07-01 11:53:24.707 D/BluetoothGatt(10377): close() 07-01 11:53:24.707 D/BluetoothGatt(10377): unregisterApp() - mClientIf=6
如您所见,我与蓝牙堆栈的所有交互都发生在主线程上(#1)。 但尽管如此,我在onClientConnectionState
处理程序中收到状态133。
我的清单有以下权限:
我正在使用最新的Marshmallow工具进行编译,目标是Marshmallow,最低目标为4.0.3(API级别15)。
可能是什么导致了这个?
(注意:你可能已经这样做了,但我不熟悉C#)
根据我的经验,实际上并不是你只是在主线程上与BLE设备进行交互,只是你不会立即向设备发出太多请求。
我曾经在Android上使用BLE时遇到这个问题(并阅读关于使用主线程的类似评论),这是因为我向远程Gatt发布了太多请求(读/写,通知/指示注册等)设备在接收BluetoothGattCallback对象中先前操作的回调之前。 我设置了自己的托管gatt操作队列(一个阻塞的线程,直到在GattCallback中收到该操作的回调,或者初始读/写操作返回false,然后处理下一个排队操作或使用退避乘数重试),因为我没有遇到这个问题。 据我所知,Android并没有很好地完成“排队”操作,因此“isBusy”布尔会在不知情的情况下咬你(如果没有跳出来,请查看BlueoothGattCharacteristic写入方法)。 我还注意到你不想在你的回调对象中做很多工作,但是将回调委托给另一个线程或者广播结果(所以你不要阻止Binder线程)。 通常我只是复制字节有效负载,并将其传递给另一个HandlerThread进行解析。
此外,是的,断断续续和关闭是非常重要的。 我通常使用服务来处理BLE交互,并在服务的onDestroy完成之前调用这两者。
- 由于服务器执行失败,Visual Studio模拟器无法启动
- Xamarin自定义视图ClassNotFoundException
- 可以异步/等待了解Android活动生命周期吗?
- 如何将多个映像从android发送到WCF Rest服务作为流写入网络驱动器?
- Android Unity c#:UnauthorizedAccessException写保存游戏数据
- 如何在Xamarin for Android中压缩文件?
- 在跨平台xamarin项目(ios和android)中使用c#从查询列表中检索数据时面临参数exception错误
- Unity3D在Android清单文件中插入多个MAIN活动
- 警报每次打开应用程序时都会关闭