Par*_*rth 20 android bluetooth-lowenergy android-8.1-oreo
我使用像素与最新的Android 8.1.0更新.
我正面临与BLE广告扫描有关的问题.每当我关闭屏幕(即按下电源按钮)时,我的扫描将停止.它会在打开屏幕后立即重启.
我查看了BLE的最新代码.谷歌新推出此功能(参考链接).
有没有办法跳过这部分,我的意思是扫描不应该停止,无论屏幕打开或关闭.
dav*_*ung 34
从Android 8.1开始,屏幕关闭时会阻止未经过滤的蓝牙扫描.虽然在Android的次要版本中进行如此戏剧性的更改是令人惊讶的,但这肯定是基于提交中的注释的预期更改: 在屏幕关闭时停止未经过滤的BLE扫描.
解决方法是使用ScanFilter进行所有扫描.新的8.1操作系统代码只是验证屏幕关闭时激活的任何扫描都至少有一个扫描过滤器.如果满足这些条件,扫描结果将按照Android 8.0.x及更早版本提供.
要设置此类扫描,您必须使用Android 5.0中引入的API并在ScanFilter每次扫描时创建一个.以下是一个过滤器,可以找到Apple生产商ID为0x004c的任何设备的制造商广告(这将包括iBeacons):
ScanFilter.Builder builder = new ScanFilter.Builder();
builder.setManufacturerData(0x004c, new byte[] {});
ScanFilter filter = builder.build();
Run Code Online (Sandbox Code Playgroud)
同样,如果您对GATT服务广告感兴趣(例如与Eddystone信标一起使用的那种广告),您可以使用以下过滤器搜索GATT服务UUID:
ScanFilter.Builder builder = new ScanFilter.Builder();
String serviceUuidString = "0000feaa-0000-1000-8000-00805f9b34fb";
String serviceUuidMaskString = "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF";
ParcelUuid parcelUuid = ParcelUuid.fromString(serviceUuidString);
ParcelUuid parcelUuidMask = ParcelUuid.fromString(serviceUuidMaskString);
builder.setServiceUuid(parcelUuid, parcelUuidMask);
ScanFilter filter = builder.build();
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以为单个扫描添加多个过滤器,任何匹配都将返回结果.这里唯一真正的限制是您必须知道所有制造商代码或您可能预先匹配的所有GATT服务UUID,至少在屏幕关闭时扫描.
您可以使用以下代码开始扫描:
bluetoothAdapter.getBluetoothLeScanner().startScan(filters, settings, scanCallback);
Run Code Online (Sandbox Code Playgroud)
编辑:也可以使用如下所示的空 来执行ScanFilter此操作:
ScanFilter.Builder builder = new ScanFilter.Builder();
ScanFilter filter = builder.build();
Run Code Online (Sandbox Code Playgroud)
如果您使用这样的扫描过滤器,它将匹配任何广告数据包,并且仍允许在Android 8.1上关闭屏幕进行检测,从而在Android 8.0.x及更早版本中有效地提供相同的行为.
编辑2:在带有Android 8.1的Galaxy Note 9以及其他带有8.1的三星设备上,即使使用空扫描过滤器,扫描也会被屏幕关闭.如上所述,在屏幕关闭的情况下允许扫描非空扫描滤波器.
| 归档时间: |
|
| 查看次数: |
4680 次 |
| 最近记录: |