我的应用程序需要进行BLE扫描,我们使用了BluetoothAdapter.startLeScan(BluetoothAdapter.LeScanCallback回调)的API,但是此API需要ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION的许可,这会带来糟糕的用户体验。
我发现Android 8.0之后有一个CompanionDeviceManager的新API,我们曾使用它进行BLE扫描。我们参考以下说明。 https://developer.android.google.cn/guide/topics/connectivity/companion-device-pairing
但是该API有时无法扫描任何设备。
谁能告诉我原因或其他建议?
这是我们的演示代码。
mDeviceManager = getSystemService(CompanionDeviceManager.class);
mDeviceFilter = new BluetoothLeDeviceFilter.Builder()
.build();
mPairingRequest = new AssociationRequest.Builder()
.addDeviceFilter(mDeviceFilter)
.setSingleDevice(false)
.build();
mDeviceManager.associate(mPairingRequest,
new CompanionDeviceManager.Callback() {
@Override
public void onDeviceFound(IntentSender chooserLauncher) {
try {
Log.i("tata", "ondeviceFound");
startIntentSenderForResult(chooserLauncher,
SELECT_DEVICE_REQUEST_CODE, null, 0, 0, 0);
}catch(Exception e){
Log.i("tata", "Exception");
}
}
},
null);
}
我们的分析
我们发现,当问题发生时,mBLEScanner有时为null。
DeviceDiscoveryService中的功能startDiscovery(AssociationRequest请求):
private void startDiscovery(AssociationRequest request) {
......
if (shouldScan(mBLEFilters) && mBLEScanner != null) {
mBLEScanCallback = new BLEScanCallback();
mBLEScanner.startScan(mBLEScanFilters, mDefaultScanSettings, mBLEScanCallback);
}
......
}