如何在Android中使用CompanionDeviceManager启动ble扫描?

时间:2018-07-02 07:50:16

标签: bluetooth bluetooth-lowenergy

我的应用程序需要进行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);
    }
    ......
}

0 个答案:

没有答案