J'utilise Alt Beacon dans mon projet pour détecter des balises, cela fonctionne parfaitement sur mon Samsung S7 (Android 7) mais sur un Samsung S10, Oneplus 6 et Google Pixel 3 XL (Android 9/10). T Travailler du tout.
Le code ne semble pas trouver de balises. p>
Mon code commence par une vérification de l'autorisation: p>
override fun onBeaconServiceConnect() {
model.beaconManager?.addRangeNotifier { beacons, _ ->
if (beacons.isNotEmpty()) {
val firstBeacon = beacons.iterator().next()
val firstBeaconNameSpace = "${firstBeacon.id1}".replace("0x", "")
val firstBeaconIdentifier = "${firstBeacon.id2}".replace("0x", "")
Log.d(TAG, "Beacon $firstBeaconNameSpace - $firstBeaconIdentifier is " + firstBeacon.distance + " meters away.")
}
}
/**
* Attach
*/
try {
model.beaconManager?.startRangingBeaconsInRegion(Region("com.MYAPP.MYAPP", null, null, null))
Log.d(TAG, "Added Range Notifier")
} catch (e: RemoteException) {
Log.d(TAG, "Error adding Range Notifier")
e.printStackTrace()
}
}
3 Réponses :
Le problème n'a probablement rien à voir avec la bibliothèque de balises Android et est simplement liée aux restrictions du système d'exploitation Android sur l'utilisation de la minuterie sur Android 8+. p>
Démarrage de la version 8, les applications Android sont terminées par le système d'exploitation après 10 minutes d'exécution d'arrière-plan à moins que le garde-plan soit actif. Cette minuterie ne fera donc jamais tirer si vous gardez l'écran sur, déverrouillé et l'application visible à l'écran: Vous pouvez modifier votre architecture pour que cela fonctionne pour fonctionner sur Android 8+ ou vous pouvez configurer la bibliothèque pour utiliser son service au premier plan intégré pour contourner la restriction. Voir ici pour des instructions. P> handler.posdelayed (ceci, 1200000) // 20 minutes code> p> p> P> P>
Merci pour la réponse. Le cas d'utilisation pour mon application est uniquement au premier plan, je n'ai pas besoin d'écouter en arrière-plan. Même si je quitte l'application s'ouvre à l'écran où la balise se lie, elle ne trouve pas de balise jamais. Où l'appareil Android 7 le trouve après environ 20 secondes (comme prévu)
Es-tu sûr de ça? Il faudrait un peu d'effort pour laisser un écran sur 20 minutes tout droit sans jamais laisser l'écran éteindre ou le verrouillage du téléphone. Vous mentionnez également "20 secondes" dans le commentaire ci-dessus, mais le code dit clairement "20 minutes b>".
Oui, c'est l'intérieur d'un gestionnaire, cela signifie que le code fonctionnera une fois instantanément, puis à nouveau dans les 20 minutes. Il se liera ensuite au consommateur. Ensuite, le téléphone trouvera une balise (environ 20 secondes). Une fois qu'il trouve une balise, le consommateur serait un engourdi.
Le code à l'intérieur du fil fonctionnera, puis le gestionnaire retirera ensuite les 1200 000 millisecondes et exécuter ce code à nouveau.
Je sais, car j'avais des problèmes lorsque j'ai travaillé avec des balises, que pour les appareils exécutant oréo et au-dessus de la tâche de fond ne fonctionne pas. P>
Pour ce dispositif, j'ai utilisé Jobscheduler .... P>
c'est un tutoriel à ce sujet https://www.youtube.com/watch?v=3eqwmme-hna p>
J'espère que cela peut vous aider;) p>
bonne chance p>
La raison pour laquelle cela ne fonctionnait pas est parce que je lie la balise avant d'ajouter la mise en page de balise ...
Avant: p>
beaconManager?.beaconParsers?.clear() beaconManager?.beaconParsers?.add(BeaconParser().setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT)) beaconManager?.bind(view)
Heureux de vous entendre trouver la solution.