web-dev-qa-db-fra.com

Le scan BLE ne fonctionne pas lorsque l'écran est éteint Android 8.1.0

J'utilise pixel avec la dernière mise à jour Android 8.1.0.

Je rencontre un problème lié à la numérisation des publicités BLE. Chaque fois que j'éteins l'écran (c'est-à-dire que j'appuie sur le bouton d'alimentation), ma numérisation s'arrête. il redémarrera immédiatement après avoir allumé l'écran.

J'ai vérifié le dernier code pour BLE. Google a récemment introduit cette fonctionnalité ( Lien de référence ).

Existe-t-il un moyen d'ignorer cette partie, je veux dire que l'analyse ne doit pas s'arrêter quel que soit l'écran allumé ou éteint.

20
Parth

À partir de Android 8.1, non filtré les analyses Bluetooth sont bloquées lorsque l'écran est éteint. Bien qu'il soit surprenant qu'un changement aussi spectaculaire soit effectué dans une version mineure d'Android, il s'agit certainement d'un changement prévu basé sur les commentaires du commit: Arrêtez les analyses BLE non filtrées lorsque l'écran s'éteint.

La solution consiste à utiliser un ScanFilter avec toutes les analyses. Le nouveau code du système d'exploitation 8.1 vérifie simplement que tous les scans actifs lorsque l'écran est éteint ont au moins un filtre de scan. Si ces conditions sont remplies, les résultats de l'analyse sont fournis comme dans Android 8.0.x et versions antérieures).

Pour configurer une telle analyse, vous devez utiliser les API introduites dans Android 5.0 et créer un ScanFilter avec chaque analyse. Ci-dessous est un filtre qui trouvera les publicités du fabricant pour tout appareil de Apple avec l'ID de fabricant 0x004c (cela inclura les iBeacons):

ScanFilter.Builder builder = new ScanFilter.Builder();
builder.setManufacturerData(0x004c, new byte[] {});
ScanFilter filter = builder.build();

De même, si vous êtes intéressé par les publicités du service GATT (comme le type utilisé avec les balises Eddystone), vous pouvez rechercher un UUID du service GATT avec un filtre comme celui-ci:

ScanFilter.Builder builder = new ScanFilter.Builder();
String serviceUuidString = "0000feaa-0000-1000-8000-00805f9b34fb";
String serviceUuidMaskString = "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF";
ParcelUuid parcelUuid = ParcelUuid.fromString(serviceUuidString);
ParcelUuid parcelUuidMask = ParcelUuid.fromString(serviceUuidMaskString);
builder.setServiceUuid(parcelUuid, parcelUuidMask);
ScanFilter filter = builder.build();

Si nécessaire, vous pouvez ajouter plusieurs filtres à une seule analyse et tout résultat correspondant donnera des résultats. La seule vraie limitation ici est que vous devez connaître tous les codes du fabricant ou tous les UUID du service GATT que vous pourriez faire correspondre à l'avance, au moins lors de la numérisation avec l'écran éteint.

Vous démarrez votre scan avec un code comme celui-ci:

bluetoothAdapter.getBluetoothLeScanner().startScan(filters, settings, scanCallback);

EDIT: Il est également possible de le faire avec un videScanFilter qui ressemble à ceci:

ScanFilter.Builder builder = new ScanFilter.Builder();
ScanFilter filter = builder.build();

Si vous utilisez un tel filtre d'analyse, il correspondra à n'importe quel paquet publicitaire et autorisera toujours les détections avec l'écran éteint sur Android 8.1, vous donnant effectivement le même comportement sur Android 8.0.x et versions antérieures.

EDIT 2 : Sur le Galaxy Note 9 avec Android 8.1 et peut-être d'autres appareils Samsung avec 8.1, les analyses sont bloquées avec l'écran est désactivé même avec un filtre d'analyse vide. Les analyses sont autorisées avec l'écran désactivé avec un filtre d'analyse non vide comme décrit ci-dessus.

33
davidgyoung

J'ai fait face au même problème. J'avais des filtres de numérisation afin de numériser les appareils BLE même si l'écran était verrouillé. Mais sur les appareils Samsung, cela ne fonctionnait pas, alors je recherche sur le forum Samsung et j'ai découvert Knox SDK ( https://seap.samsung.com/sdk/knox-Android ).

Et c'était la solution de mon problème. Tout ce que vous avez à faire est de l'ajouter à votre application, de créer une licence et de l'activer et enfin d'utiliser cette méthode addPackageToBatteryOptimizationWhiteList pour déverrouiller l'analyse lorsque l'écran de l'appareil Samsung est verrouillé.

1
yozzy

Évidemment non, à moins qu'ils aient raté quelque chose. Mais cela fonctionnera toujours en arrière-plan si vous avez des filtres de balayage, que vous devriez de toute façon avoir. Est-ce vraiment un problème?

1
Emil