web-dev-qa-db-fra.com

«L'application scanne trop fréquemment» avec ScanSettings.SCAN_MODE_OPPORTUNISTIC

J'ai remarqué un problème sur Samsung S8, Android 7.0 (pd. Cela se produit également sur Android 7.0: Samsung S7, Nexus 5x ) qui indique (après quelques tests) que l'application analyse trop fréquemment:

08-14 12:44:20.693 25329-25329/com.my.app D/BluetoothAdapter: startLeScan(): null
08-14 12:44:20.695 25329-25329/com.my.app D/BluetoothAdapter: STATE_ON
08-14 12:44:20.696 25329-25329/com.my.app D/BluetoothAdapter: STATE_ON
08-14 12:44:20.698 25329-25329/com.my.app D/BluetoothLeScanner: Start Scan
08-14 12:44:20.699 25329-25329/com.my.app D/BluetoothAdapter: STATE_ON
08-14 12:44:20.700 25329-25329/com.my.app D/BluetoothAdapter: STATE_ON
08-14 12:44:20.700 25329-25329/com.my.app D/BluetoothAdapter: STATE_ON
08-14 12:44:20.701 25329-25329/com.my.app D/BluetoothAdapter: STATE_ON
08-14 12:44:20.703 4079-4093/? D/BtGatt.GattService: registerClient() - UUID=dbaafee1-caf1-4482-9025-b712f000eeab
08-14 12:44:20.807 4079-4204/? D/BtGatt.GattService: onClientRegistered() - UUID=dbaafee1-caf1-4482-9025-b712f000eeab, clientIf=5, status=0
08-14 12:44:20.808 25329-25342/com.my.app D/BluetoothLeScanner: onClientRegistered() - status=0 clientIf=5 mClientIf=0
08-14 12:44:20.809 4079-7185/? D/BtGatt.GattService: start scan with filters
08-14 12:44:20.811 4079-7185/? D/BtGatt.GattService: getScanSettings 
08-14 12:44:20.812 4079-7185/? D/BtGatt.GattService: Is it foreground application = true
08-14 12:44:20.812 4079-7185/? D/BtGatt.GattService: not a background application
08-14 12:44:20.817 4079-7185/? E/BtGatt.GattService: App 'com.my.app' is scanning too frequently

Le problème réside certainement dans ces 6 résultats d'appel STATE_ON, c'est la partie du changement de comportement BLE non documenté, mentionné pour la première fois dans les notes de version DP4:

Nous avons modifié le comportement de numérisation BLE à partir de DP4. Nous empêcherons les applications de démarrer et d'arrêter les analyses plus de 5 fois en 30 secondes. Pour les analyses de longue durée, nous les convertirons en analyses opportunistes.

Ce que je n'obtiens pas, ce sont les 6 scans en moins de 30 secondes même si je mets: ScanSettings.setScanMode(ScanSettings.SCAN_MODE_OPPORTUNISTIC).

Le code est:

List<ScanFilter> filters = new ArrayList<>();
ScanSettings scanSettings = new ScanSettings.Builder()
    .setScanMode(ScanSettings.SCAN_MODE_OPPORTUNISTIC)
    .build();
bluetoothAdapter.getBluetoothLeScanner().startScan(filters, scanSettings, recoderScanCallback);
//events from the log happen before this log is printed
Log.i("test", " started!");
return recoderScanCallback.scanResultObservable().map((ScanResult record) -> {
    //never gets here
    Log.i("test", " result!");
});

RecorderScanCallback est dérivé de ScanCallback. Nous ne pouvons pas utiliser RxAndroidBle#rxBleClient.scanBleSettings (ScanSettings) car notre code est sur le point de geler et nous utilisons la version 1.1.0 de la lib.

Pourquoi ScanSettings.setScanMode Ne modifie-t-il pas les résultats de la recherche?

41
Margarita Litkevych

Android 7 empêche les démarrages/arrêts de l'analyse plus de 5 fois en 30 secondes. Le mauvais côté, c'est qu'il ne renvoie pas d'erreur, au lieu de cela, il imprime simplement un journal. L'application pense que l'analyse est lancée, mais elle n'a pas réellement commencé à la pile de bleus. Il convertit également les analyses de longue durée en analyses opportunistes dans le but de prévenir les applications abusives. La durée est de 30 minutes pour une analyse longue durée.

Ces modifications ne sont pas documentées, mentionnées dans cet article: https://blog.classycode.com/undocumented-Android-7-ble-behavior-changes-d1a9bd87d98

3
Safa Kadir