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

人盡茶涼 提交于 2019-12-06 05:19:20

问题


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".



来源:https://stackoverflow.com/questions/34060622/android-ble-startdiscovery-callback-is-not-fired-even-with-location-permission

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