问题
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