Android BLE startDiscovery() callback is not fired even with Location permissions

匿名 (未验证) 提交于 2019-12-03 03:10:03

问题:

The app is targeted to 22 with minimum version 18 and works as expected on Lollipop. Starting Marshmallow apps need to require 'fine' and 'coarse' permissions for BLE. I've added them but the callback is not fired.

AndroidManifest:

...  <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>      <!-- ble -->     <uses-permission android:name="android.permission.BLUETOOTH" />     <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />     <uses-permission android:name="android.permission.INTERNET" />     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />      <!-- for Android M  BLE requires the following permissions too -->     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

Discovery is done with UUID filtering:

this.adapter.startLeScan(new UUID[]{this.serviceUUID}, this.discoveryListener);

Callback:

@Override public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {     Log.d(TAG, "Bluetooth device found: " + device);     foundBluetoothDevices.add(device); }

I can see the devices are found but callback is not fired:

12-03 12:34:19.266    9003-9003/com.company.project D/FindCamerasTask Discovery started 12-03 12:34:19.266    9003-9003/com.company.project D/BluetoothAdapter startLeScan(): [Ljava.util.UUID;@dd832eb 12-03 12:34:19.268    9003-9003/com.company.project D/BluetoothAdapter STATE_ON 12-03 12:34:19.270    4362-4375/? D/BtGatt.GattService registerClient() - UUID=92d098d2-0da1-4908-8194-14c504680fae 12-03 12:34:19.271    4362-4382/? D/BtGatt.GattService onClientRegistered() - UUID=92d098d2-0da1-4908-8194-14c504680fae, clientIf=5 12-03 12:34:19.271    9003-9064/com.company.project D/BluetoothLeScanner onClientRegistered() - status=0 clientIf=5 12-03 12:34:19.271    4362-4401/? D/BtGatt.GattService start scan with filters 12-03 12:34:19.273    4362-4385/? D/BtGatt.ScanManager handling starting scan 12-03 12:34:19.288    4362-4382/? D/BtGatt.GattService onScanFilterEnableDisabled() - clientIf=5, status=0, action=1 12-03 12:34:19.288    4362-4382/? D/BtGatt.ScanManager callback done for clientIf - 5 status - 0 12-03 12:34:19.288    4362-4385/? D/BtGatt.ScanManager addFilterToController: 2 12-03 12:34:19.302    4362-4382/? D/BtGatt.GattService onScanFilterConfig() - clientIf=5, action = 0 status = 0, filterType=2, availableSpace=47 12-03 12:34:19.302    4362-4382/? D/BtGatt.ScanManager callback done for clientIf - 5 status - 0 12-03 12:34:19.302    4362-4385/? D/BtGatt.ScanManager configureFilterParamter 500 10000 1 0 12-03 12:34:19.316    4362-4382/? D/BtGatt.GattService onScanFilterParamsConfigured() - clientIf=5, status=0, action=0, availableSpace=15 12-03 12:34:19.316    4362-4382/? D/BtGatt.ScanManager callback done for clientIf - 5 status - 0 12-03 12:34:19.316    4362-4385/? D/BtGatt.ScanManager configureRegularScanParams() - queue=1 12-03 12:34:19.317    4362-4385/? D/BtGatt.ScanManager configureRegularScanParams() - ScanSetting Scan mode=2 mLastConfiguredScanSetting=-2147483648 12-03 12:34:19.317    4362-4385/? D/BtGatt.ScanManager configureRegularScanParams - scanInterval = 8000configureRegularScanParams - scanWindow = 8000 12-03 12:34:19.318    4362-4382/? D/BtGatt.GattService onScanParamSetupCompleted : 0 12-03 12:34:19.466    4362-4382/? D/bt_btif_gattc btif_gattc_update_properties BLE device name=Device-00W15380138 len=17 dev_type=2 12-03 12:34:19.701    4362-4382/? D/bt_btif_gattc btif_gattc_update_properties BLE device name=Device-20154300041 len=17 dev_type=2 12-03 12:34:21.021    4362-4382/? D/bt_btif_gattc btif_gattc_update_properties BLE device name=Device-20154300015 len=17 dev_type=2 12-03 12:34:39.278    9003-9003/com.company.project W/BleRpcConnectionFactory Discovery timeout fired (20000) 12-03 12:34:39.279    9003-9003/com.company.project D/BluetoothAdapter stopLeScan() 12-03 12:34:39.324    4362-4382/? D/BtGatt.GattService onScanFilterParamsConfigured() - clientIf=5, status=0, action=1, availableSpace=16 12-03 12:34:39.324    4362-4382/? D/BtGatt.ScanManager callback done for clientIf - 5 status - 0 12-03 12:34:39.324    4362-4385/? D/BtGatt.ScanManager configureRegularScanParams() - queue=0 12-03 12:34:39.324    4362-4385/? D/BtGatt.ScanManager configureRegularScanParams() - ScanSetting Scan mode=-2147483648 mLastConfiguredScanSetting=2 12-03 12:34:39.324    4362-4385/? D/BtGatt.ScanManager configureRegularScanParams() - queue emtpy, scan stopped

I've checked 'Location' permission granted in Android > Settings > Apps > Permissions. Testing on Nexus 9. Any thoughts?

PS. I've tried API 21 adapter.getBluetoothLeScanner().startScan(filters, scanSettings, internalScanCallbackAPI21); and still no luck - similar log but no callback is fired.

PPS. I made it working if setting report delay:

ScanSettings scanSettings = new ScanSettings.Builder()             .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)             .setReportDelay(discoveryDelay)  // 0 for immediate callback (not working for me), > 0 for batch mode             .build();

if setting 0 for immediate callback still not getting listener fired.

回答1:

I had to set report delay = 1 as callback is not fired for 0 (immediate callback):

ScanSettings scanSettings = new ScanSettings.Builder()                 .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)                 .setReportDelay(1) // '0' or  not setting any value will lead to callback not fired!                 .build();

Feel free to suggest better solution instead of this "dirty little hack".



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!