Обратный вызов Android BLE startDiscovery() не запускается даже с разрешениями местоположения

Приложение предназначено для 22 с минимальной версией 18 и работает, как и ожидалось, на Lollipop. Запуск приложений Marshmallow должен требовать «точных» и «грубых» разрешений для BLE. Я добавил их, но обратный вызов не запускается.

AndroidМанифест:

...

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

Обнаружение выполняется с фильтрацией UUID:

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

Перезвонить:

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

Я вижу, что устройства найдены, но обратный вызов не запускается:

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

Я проверил разрешение «Местоположение», предоставленное в Android> Настройки> Приложения> Разрешения. Тестирование на Nexus 9. Есть мысли?

PS. Я пробовал API 21 adapter.getBluetoothLeScanner().startScan(filters, scanSettings, internalScanCallbackAPI21); и все равно не повезло - аналогичный журнал, но обратный вызов не запускается.

ППС. Я заставил его работать, если установил задержку отчета:

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();

если установка 0 для немедленного обратного вызова все еще не запускает прослушиватель.


person 4ntoine    schedule 03.12.2015    source источник


Ответы (1)


Мне пришлось установить задержку отчета = 1, так как обратный вызов не запускается для 0 (немедленный обратный вызов):

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();

Не стесняйтесь предлагать лучшее решение вместо этого «грязного маленького хака».

person 4ntoine    schedule 03.12.2015