11

我遇到了Android 6.0和一些蓝牙低功耗设备的严重问题。其中一个抵触的装置是这样的一种:Android 6.0棉花糖BLE连接问题

DEVICE INFO: 
Name:   Samsung Galaxy SV 
Model number: SM-G900V 
Android vers: 6.0.1 
Patch level: May 1, 2016 
Hard. vers: G900V.05 

如果我让一些压力测试基于连接和断开该应用一个BLE外围成功率勉强达到50%。

读了Android的最新文档,他们建议以指定connectGatt方法的最后一个参数的传输模式来执行BLE交通连接,而非BR/EDR:

device.connectGatt(this, false, mGattCallback, BluetoothDevice.TRANSPORT_LE); 

自认倒霉改善改变。

继一些suggestions并阅读了关于BLE连接问题后,我发现了三星Galaxy S6的几个相关问题,并在one of those中提出了一系列解决BLE连接问题的步骤。关键之一是对clear Bluetooth Share system app数据。这样做,连接率立即增加了几乎100%的成功。但是,如果您等待和其他一些BLE应用程序一起玩并连接到其他外设,问题迟早会回来。

有在试图解决这些BLE问题,他们基本上做的是谷歌播放some apps

/system/bin/rm -r /data/misc/bluetoothd/* 
/system/bin/rm -r /data/misc/hcid/* 

虽然这是一个方法来清除蓝牙高速缓存,它需要植根是设备不是专业应用程序的合理解决方案。

我研究的私人Android API并没有帮助我解决这个问题,而我发现的唯一类似的是enforce service discovery cache cleanup,这与问题无关。

使用BLE分组嗅探我看到ADV_CONNECT_REQ甚至没有从设备发送到外围设备,并在一段时间后在Android堆触发BluetoothGattCallbackSTATE_DISCONNECTED事件。

我不完全知道为什么这个问题出现在一些6.0设备中,而不是其他的,因为蓝牙共享缓存似乎是问题所在。那里存储的是什么?刚刚连接/配对的设备?我是唯一遇到这个问题的人吗?如果不是,你们如何解决它?我不想指导最终用户如何清除蓝牙共享应用程序数据。

+0

测试这对S6边缘,我可以证实,清除蓝牙共享缓存和数据帮助其连接,而无需通过BluetoothDevice.TRANSPORT_LE参数。我失去了为什么会发生这种情况。清除缓存之前,它根本没有连接。 –

+0

这很好,你知道我不是唯一一个。感谢@CanCanbek的反馈,希望有人能帮助我们。 – GoRoS

+0

我看了上面的内容,我明白了你的意思,在6.0系统上的S6 edge,在执行connectGatt()函数后,执行到cache操作,可以保证正常的手机和通信设备不会有耽搁。这是什么意思?@ Can Canbek – amibition

回答

0

有一种叫做“removeBond”的隐藏方法。有时候,无法清楚地断开无线设备,在这种情况下,您需要调用删除键。从here

//remove authrization 
    Method method = null; 
    try { 
     method = gatt.getDevice().getClass().getMethod("removeBond", (Class[]) null); 
     method.invoke(gatt.getDevice(), (Object[]) null); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }   
    gatt.disconnect(); 

此外

代码,您可以使用隐藏方法 “刷新” 刷新关贸总协定服务。最初的刷新方法是更新gatt服务,但在某些不必要的断开连接的情况下,您可能需要刷新以正确连接您的gatt服务。

How to programmatically force bluetooth low energy service discovery on Android without using cache