我想在Android M中构建我的扫描设置,以便在一个ScanCallback对象中为三个不同的事件获得单独的回调:
API中有三个选项:
CALLBACK_TYPE_ALL_MATCHES
CALLBACK_TYPE_FIRST_MATCH
CALLBACK_TYPE_MATCH_LOST
Run Code Online (Sandbox Code Playgroud)
遗憾的是,没有一个关于这三个选项是否可以一起使用的良好文档.根据我的实验,我应该只选择其中一个.API是否离我们需要分开同时进行扫描,以获取回调CALLBACK_TYPE_ALL_MATCHES ,并CALLBACK_TYPE_MATCH_LOST在同一时间?有没有人对如何使用这些选项有任何好的经验?
编辑:
检查API源代码后,我发现这CALLBACK_TYPE_FIRST_MATCH | CALLBACK_TYPE_MATCH_LOST也是一个有效的组合.然而,CALLBACK_TYPE_FIRST_MATCH与之相比,使用它会使发现明显变慢(~30秒)CALLBACK_TYPE_ALL_MATCHES.此外,CALLBACK_TYPE_MATCH_LOST尽管该设备正在积极地进行广告宣传.我不认为这个API是可靠的.
这是我的结果:
12:02:50.179 31627-31655 D/BluetoothLeScanner:onClientRegistered() - status = 0 clientIf = 6
12:03:24.877 31627-31627 D/ScanCallbackMarshmallow:ScanResult {mDevice = E8:A8:C9:82:17:61, ...}
12:03:24.878 31627-31627 D/ScanCallbackMarshmallow:CALLBACK_TYPE_FIRST_MATCH
12:03:29.905 31627-31627 D/ScanCallbackMarshmallow:ScanResult {mDevice = C0:B6:43:1E:45:28,...}
12 :03:29.906 31627-31627 D/ScanCallbackMarshmallow:CALLBACK_TYPE_FIRST_MATCH
12:03:39.721 31627-31627 D/ScanCallbackMarshmallow:ScanResult {mDevice = D8:35:26:9D:55:B4,...}
12:03:39.722 31627 -31627 D/ScanCallbackMarshmallow:CALLBACK_TYPE_FIRST_MATCH12:04:21.889 718-730 D/BluetoothLeScanner:onClientRegistered() - status …
Android BluetoothGatt.class拥有mClientIf私人领域.与BLE事件相关的大多数日志消息都包含此值.例如:
onClientRegistered() - status = 0 clientIf = 17
该mClientIf领域代表什么?这个字段的整数值告诉了什么?
我正在使用Android 5.0.1 Lollipop并开发蓝牙低功耗服务器 - 客户端通信.我有三星Galaxy s4.我的自定义服务中有三个特征.我将特性的属性之一作为只写和加密写入.然后我将其更改为非加密写入.写操作不再适用于此特性.我知道我必须从设置重新启动蓝牙适配器并取消配对设备,但它根本不起作用.然后我改变了特征的UUID.它发现了旧UUID的特性.我不懂.如何从蓝牙适配器中删除与某个特定设备相关的所有蓝牙数据?
编辑:我用iPhone和iPhone设备加倍检查.iPhone发现新UUID的特性,而Android发现旧UUID.
我正在开发一款Android应用程序,用于搜索经典和低能耗的蓝牙设备,这样当我按下"搜索"按钮时,它会向我显示范围内的所有蓝牙设备(低能量和经典).由于经典的BT发现和LE扫描是不同的东西,我必须单独实现它们并将它们组合在一个功能中
searchFirstLowEnergyThenClassic()或searchFirstClassicThenLowEnergy()
为了实现这一点,我必须知道发现/扫描何时结束,以便我立即开始扫描/发现其他技术.
这是我的实现:
这看起来不错,但是当我扩展行为时会出现问题.当我想要搜索时,我首先使用LE扫描或基于最后连接技术的经典发现进行搜索.例如,如果设备上次连接到Classic BT设备,则运行searchFirstClassicThenLowEnergy().否则,searchFirstLowEnergyThenClassic().
正如你可能猜到的那样,它变得更加复杂.例如,当经典BT发现结束时,应用程序应该知道搜索是否结束还是应该继续进行LE扫描.
还有这个问题.当用户在扫描/发现第一项技术期间停止搜索时,它将收到BluetoothAdapter.ACTION_DISCOVERY_FINISHED,但由于用户终止搜索,因此不应启动LE扫描.
我使用一些标志(虽然工作不正常)实现了这一点,但我的代码看起来很脏.
else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
// Classic Bluetooth discovery ended
lastOpenedType = getLastOpenedType();
if (lastOpenedType == BT_CLASSIC && !isSearchStoppedByUser()) {
// Search should continue with low energy scan
startBtLeScanning();
} else if (lastOpenedType != BT_CLASSIC && !isSearchStoppedByUser()){
// Search ended
searchProgressLayout.setVisibility(View.INVISIBLE);
} else {
// Search ended by user
searchProgressLayout.setVisibility(View.INVISIBLE);
}
}
Run Code Online (Sandbox Code Playgroud)
简而言之,我想问一个人是否有更聪明,更简单的解决方案?
PS.如果可能,非常感谢没有广播意图的解决方案.
android bluetooth discovery bluetooth-lowenergy network-scan