CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[ANDROID] Probleme de localisation

Pseudo supprimé
Pseudo supprimé 12 mars 2014 à 11:21:13

Salut à tous,

Je suis actuellement en train de réaliser une application android qui permet (entre autres) de réaliser des scans de codes barre. Cette application doit récupérer la localisation de l'utilisateur lorsque celui ci réalise un scan.

Mon problème: Quand je regarde en base de données pour voir les informations récupérées, je me rends compte que pour certains scans la localisation ne passe pas du tout et il me met des 0 la ou je devrai avoir la lattitude et la longitude. pour les scans j'utilise la librairie (enfin l'import par intent) zwing mais pas de soucis de ce coté).

http://pastebin.com/QdX41rcS (Vivement respawn et la balise code ! ^^)

L'insertion en base de données se passe bien et je n'ai aucune erreur dans mon logcat. Le seul problème est que je souhaiterai au moins une localisation pour chaque scan meme si celle ci n'est pas précise.

Merci

Bunyan
Bunyan
Niveau 17
12 mars 2014 à 14:12:47

Et si l'utilisateur ne peut pas être localisé, que fais-tu ?
Le cas typique est un utilisateur à l'intérieur d'un bâtiment, le GPS fonctionne peu ou mal dans ces cas-là.
De plus, tu demandes une localisation précise (ACCURACY_FINE), qui demande plus de ressources et de temps à avoir. Utilise plutôt ACCURACY_COARSE : moins précis, moins consommateur de batterie et plus rapide.

Tu as un souci d'algo aussi, c'est sans doute de là que viens ton problème.
Tu enregistres en fin de scan. Que se passe-t-il dans le cas où le scan prend moins de temps que la localisation ?
Seul truc auquel je pense : faire un INSERT partiel avec les données du scan dans un premier temps et les données de localisation en second temps (utilisation d'un service pour la localisation en arrière-plan ? tout du moins un truc désolidarisé de l'Activity).

Au pire, tu peux aussi regarder du coté de getLastKnownLocation, qui refile la dernière position enregistrée. Elle peut ne pas exister, ou être a coté de la plaque (cas d'un voyage en avion par exemple).

Bunyan
Bunyan
Niveau 17
12 mars 2014 à 14:13:23

Par "le GPS", j'entends "la géolocalisation" (puce GPS + accès Wi-fi).

Pseudo supprimé
Pseudo supprimé 13 mars 2014 à 09:14:30

Merci pour ta réponse,

J'ai changer la précision par "Criteria.NO_REQUIREMENT" mais rien n'y change il y a parfois des localisations qui ne sont pas récupérées. Je vais essayer de passer par un service pour la localisation comme tu me suggère. On avait déjà penser à faire ça avec mon collègue mais comme c'est une des premières fonctionnalités qui a été codée on a un peu de mal à s'y remettre ^^

Pour ce qui est de getLastKnownLocation(); on s'en été servis au début mais cette fonction n'est pas vraiment précise come tu le dis et il arrive aussi très souvent que la localisation soit à 0.

Pseudo supprimé
Pseudo supprimé 13 mars 2014 à 11:05:38

On est finalement partit sur une toute autre démarche.

On demande à l'application au lancement d'un passage (dans un passage on réalise plusieurs scans) de récupérer la localisation de l'utilisateur dans un thread parallèle. Le service aurai été problématique avec notre application car il aurai été en conflit avec un autre service qui se charge de l'insertion en base de données (externe ou interne selon la disponibilité du réseau).

http://pastebin.com/48mUt1nL

Pense tu que cette solution est viable ?

Bunyan
Bunyan
Niveau 17
13 mars 2014 à 12:32:20

Oui, tout a fait.

Par contre, ton thread est problématique. Les while(true) sont une mauvaise pratique entraînant de l'attente active. Ici, l'application demandera des MaJ tant que l'application n'est pas tuée. Vu qu'Android a un système de mise des tâches en background plutôt que de destruction, tu crée donc une simili-fuite mémoire.

A mon avis, il sera mieux autant pour la batterie que pour la mémoire de faire une nouvelle instance de la classe lancée périodiquement par handler#postDelayed(Runnable, long).
Le while(true) serait alors à remplacer par une condition d'arrêt à déterminer pour que le Thread ne parte pas en boucle infinie + zombie.

Les variables de coordonnées sont de classe, il est aussi possible d'avoir un souci de concurrence dessus (bon... ça ne devrait pas arriver au vu du workflow...).

Pseudo supprimé
Pseudo supprimé 13 mars 2014 à 12:49:17

En fait on a de nouveau changer parce que c'est débile de faire ça dans une boucle et dans un thread parallèle puisque les requêtes d'update de la localisation se font déjà en background. de plus cette méthode effectue des requêtes périodiquement donc pas besoins de mettre cette méthode dans une boucle. On a finalement fait une classe avec le pattern singleton (pour toujours avoir la même instance afin de récupérer n'importe quand dans l'application la localisation) que l'on lance au début du passage ainsi que la méthode getLastKnownPosition(); comme cela on est sûr d'avoir une localisation pour chaque scan, puis on la détruit à la fin du passage.

http://pastebin.com/m0HVGsQu

Il y a sûrement encore quelques soucis nous sommes toujours en train de travailler dessus.

Pseudo supprimé
Pseudo supprimé 13 mars 2014 à 14:31:20

Salut,

Au vu des différents tests et de leurs résultats notre dernière solution semble très bien fonctionner. Merci Bunyan pour ton aide ça m'a été très utile même si au final nous sommes repartis sur quelque chose de différent.
Si vous avez des suggestions ou des améliorations n'hésitez surtout pas.

Merci :)

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment