La devolución de llamada de BLE start de Android BLE no se dispara incluso con permisos de ubicación

La aplicación está dirigida a 22 con la versión mínima 18 y funciona como se espera en Lollipop. Las aplicaciones de Marshmallow necesitan solicitar permisos 'finos' y 'gruesos' para BLE. Los he añadido pero la devolución de llamada no se ha iniciado.

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

El descubrimiento se realiza con el filtrado UUID:

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

Llamar de vuelta:

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

Puedo ver los dispositivos se encuentran, pero la devolución de llamada no se disparó:

 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 

He marcado el permiso "Ubicación" otorgado en Android> Configuración> Aplicaciones> Permisos. Pruebas en Nexus 9. ¿Alguna idea?

PD. He intentado API 21 adapter.getBluetoothLeScanner().startScan(filters, scanSettings, internalScanCallbackAPI21); Y aún no hay suerte – registro similar, pero no se devuelve la devolución de llamada.

PPS. Lo hice funcionar si la demora del informe del ajuste:

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

Si la configuración 0 para la devolución de llamada inmediata todavía no obtiene escuchador disparado.

Tuve que establecer el retraso del informe = 1 como la devolución de llamada no se disparó para 0 (devolución de llamada inmediata):

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

Siéntase libre de sugerir una mejor solución en lugar de este "hack poco sucio".

  • Android BLE BluetoothGatt objeto permanece conectado y desencadena onCharacteristicChanged () incluso después de una llamada a desconectar ()
  • BluetoothAdapter.startScan () vs BluetoothAdapter.startLeScan ()
  • Android: perfil de baja energía del GATT de Bluetooth
  • Kit de desarrollo BTLE (Bluetooth Low energy) - debe tener perfil de proximidad
  • Bluetooth Low Energy startScan en Android 6.0 no encuentra dispositivos
  • BluetoothGatt writeCharacteristic devuelve false
  • ¿Cuáles son los pasos para ser notificado por el dispositivo Bluetooth Low Energy (BLE)?
  • Bluetooth LE aplicación, la forma de construir cross-plaftorm (iOS-Android)?
  • ¿Cuál es la duración de la exploración en api del mensaje cercano de google?
  • Desconexión del dispositivo BLE con el dispositivo Android automáticamente. Android BLE
  • Desactivar con fuerza el dispositivo BLE conectado a la aplicación de Android activa onConnectionStateChange con el estado 8
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.