40 votes

"L'application numérise trop souvent" avec ScanSettings.SCAN_MODE_OPPORTUNISTIC

J'ai remarqué un problème sur le Samsung S8, Android 7.0 (upd. C'est également le cas sur Android 7.0: Samsung S7, Nexus 5x) qui indique (après quelques essais) cette application est l'analyse trop souvent:

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 se trouve dans les 6 STATE_ON des résultats des appels, c'est la partie des sans-papiers, POUR le changement de comportement, d'abord mentionné dans DP4 notes de version:

Nous avons changé le BLE de la Numérisation de comportement de départ en DP4. Nous allons empêcher les applications de démarrage et d'arrêt des scans plus de 5 fois en 30 secondes. Pour de longues analyses, nous allons convertir en opportuniste analyses.

Ce que je n'ai pas sont les 6 scans en moins de 30 secondes, même si j'ai mis: 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 l' ScanCallback. Nous ne pouvons pas utiliser RxAndroidBle#rxBleClient.scanBleSettings(ScanSettings) parce que notre code est sur le point de geler et nous utilisons la version 1.1.0 de la version de la lib.

Pourquoi est - ScanSettings.setScanMode de ne pas modifier les résultats de la recherche?

9voto

Safa Kadir Points 106

Android 7 empêche le démarrage du scanner-arrête plus de 5 fois en 30 secondes. Le mauvais côté est, il ne retourne pas une erreur, au contraire imprime un journal. L'app pense que l'analyse est lancé, mais il n'est pas réellement commencé à revenir à la ble de la pile. Aussi, il convertit les analyses longue durée opportunistes scan avec un but de prévention de l'abus d'applications. La durée est de 30 minutes à une longue analyse.

Ces changements sont sans papiers, mentionné dans ce post: https://blog.classycode.com/undocumented-android-7-ble-behavior-changes-d1a9bd87d983

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X