PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → GPSRecuperePosition : tres lent
GPSRecuperePosition : tres lent
Débuté par A-B, 02 fév. 2017 11:19 - 22 réponses
Posté le 02 février 2017 - 11:19
Bonjour,
Chaque appels de GPSRecuperePosition() bloque le thread principal pendant au moin 30 secondes(seulement en android, en IOS c'est instantanne), devrais-je l'executer dans un thread secondaire ? (il me semble que l'appel depuis un thread secondaire cause des exceptions)
Sinon j'ai vu qu'il y a aussi GPSDernierePosition(), quelle differences ?
J'ai aussi pense a utilise les fonctions natives en java mais plus complique.

Merci
cdlt
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 02 février 2017 - 18:50
Bonjour,

GPSRecuperePosition doit être exécuté dans un thread. Par ailleurs, il y a un timeout paramétrable dans cette fonction.

Il faut utiliser GPSSuitDéplacement à la place.

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Message modifié, 02 février 2017 - 18:50
Posté le 03 février 2017 - 10:34
Eric67 a écrit :
Bonjour,

GPSRecuperePosition doit être exécuté dans un thread. Par ailleurs, il y a un timeout paramétrable dans cette fonction.

Il faut utiliser GPSSuitDéplacement à la place.

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr


D'accord merci, du coup je dois utiliser GPSSuitDeplacement ou GPSRecuperePosition ?
J'ai essaye les 2 :
(une apres l'autre evidemment)

GPSSuitDéplacement(AsyncRecuperePosition)

Procedure AsyncRecuperePosition(g est une geoPosition)
Info(g..Latitude,g..Longitude) // 0 0 est affiche


Et aussi :

AsyncRecuperePosition()
// dans ce cas la AsyncRecuperePosition est lance toutes les 1 min en thread secondaire
Procedure AsyncRecuperePosition()
g est une geoPosition = GPSRécupèrePosition()
Info(g..Latitude,g..Longitude) // 0 0 est affiche



Resultat : les fonctions de localisation me retourne toujours 0 0 quand elles sont utilises en tache parallele, sinon dans le thread principal ca bloque pendant min 30 sec...

Sur la version IOS aucun probleme a ce niveau la pourtant.



J'ai essaye de recuperer la localisation en Java malheureusement windev ne trouve pas les classes

//import com.google.android.gms.location.*;


de google malgres que j'ai ajoute toutes les permissions liees a la localisation lors de la generation.

Je sais plus quoi faire ...
Posté le 15 février 2017 - 09:28
Personne n'utilise la géolocalisation en Android ? :o
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 15 février 2017 - 12:15
Bonjour,

La géolocalisation sur android fonctionne à la perfection. Il suffit de tester l'un des exemples d'une LST pour s'en rendre compte.

Attention, pas la géolocalisation "faible consommation" avec géoSuiviActive. qui elle est absolument inexploitable !

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Posté le 15 février 2017 - 13:33
si, mais comme tout marche bien, on ne peut pas t'aider

Le 2/15/2017 à 3:28 AM, A-B a écrit :
> Personne n'utilise la géolocalisation en Android ? :o
Posté le 16 mars 2017 - 16:26
Bonjour,

j'ai le même souci sous android.

GPSRécupèrePosition renvoie 0.0 tout le temps sur mon wiko fever de test.

pourtant sur Google map quand je clic sur "ma position", c'est récupéré instantanément !

quelqu'un a une astuce ?
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 17 mars 2017 - 09:19
Bonjour,

Un peu de code aiderait à... aider.

Comment est initialisé le GPS ?

Le mieux est encore de prendre l'exemple de PC Soft "Android GPS". Si cela fonctionne, alors comparer son code avec celui de la démo.

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
36 messages
Popularité : +4 (4 votes)
Posté le 17 mars 2017 - 16:40
Bonjour,

Moi aussi j'ai eu ce problème sur android.
J'ai créer une application pour les animaux perdu. avec de la géolocalisation.
Sur android, ce fut une vrais .....
Je vous envoie le code que j'ai fait :

dans ma page principal j'ai appeler:
COL_Geolocalisation.ActivationGPS()

dedans il y a :
Procedure ActivationGPS()
TANTQUE GPSEtat() <> 1
SELON Dialogue("Pour utiliser l'application, vous devez activer le GPS de votre téléphone.")
CAS 0
FIN
FIN

GPSInitParamètre(gpsAuto,gpsPrécisionElevée+gpsEnergieElevée)
Maposition = GPSRécupèrePosition(100,"Récupération de votre position en cours !")
géoSuiviActive(geo_activation)
GPSSuitDéplacement(CB_GeoSuiviActive,2,1)


LA procédure de geo_activation :
Procedure geo_activation(bSuiviActif est booléen, cErreur est une chaîne)
SI PAS bSuiviActif ALORS
Erreur(cErreur)
RETOUR
FIN

LA procédure de CB_GeoSuiviActive :
Procedure CB_GeoSuiviActive(pos est une geoPosition)

SI pos.Latitude <> 0 ET pos.Longitude <> 0 ALORS
Maposition = pos
SauveParamètre(POSITION_LATITUDE,Maposition.Latitude)
SauveParamètre(POSITION_LONGITUDE,Maposition.Longitude)
udpate_gps(MonidProfil,Maposition.Latitude,Maposition.Longitude)
FIN


J’espère que ce bout de code vous servira.

Petit cadeau, ceci calcule si dans un certain périmètre autour de moi (
madistance
) il y à des animaux perdu.


madistance est un entier = ChargeParamètre(DISTANCE)
i est un entier = 0
HLitRecherchePremier(utilisateurs,IDutilisateurs,MonidProfil)
SI madistance <1 ALORS
madistance = 1
FIN

SI HTrouve ALORS



//si HExécuteRequête(REQ_Geoloc_distance,hRequêteDéfaut,utilisateurs.coord_x,utilisateurs.coord_y,utilisateurs.coord_z,madistance) ALORS
ReqClient est une Source dede Données
sMaReq est une chaîne = [
SELECT utilisateurs.Latitude AS Latitude,utilisateurs.Longitude AS Longitude,utilisateurs.coord_x AS coord_x,utilisateurs.coord_y AS coord_y,
utilisateurs.coord_z AS coord_z,Animal_possédé.Type AS Type,Animal_possédé.Nom AS Nom,Animal_possédé.IDAnimal_possédé AS IDAnimal_possédé,
SQRT(((POWER(( utilisateurs.coord_x-%1),2)+POWER( ( utilisateurs.coord_y - %2) , 2) ) + POWER( ( utilisateurs.coord_z - %3 ) , 2) ) ) AS distancess
FROM
utilisateurs,
Animal_possédé
WHERE
utilisateurs.IDutilisateurs = Animal_possédé.IDutilisateurs
AND
(
distancess <= %4
AND Animal_possédé.Perdu = 1
AND Animal_possédé.Vérifié = 1
)
]
sMaReq = ChaîneConstruit(sMaReq,utilisateurs.coord_x,utilisateurs.coord_y,utilisateurs.coord_z,madistance)
Membre enregistré
637 messages
Popularité : +36 (36 votes)
Posté le 18 mars 2017 - 06:39
Bonjour,

Je ne comprends pas bien ce que la fonction géoSuiviActive fait là dedans...

Cette fonction était une nouveauté de la 21 utilisée pour un suivi en arrière plan avec une faible précision voire très mauvaise. Je ne pense pas que le mélange des 2 techniques soit judicieux...

https://doc.pcsoft.fr/fr-FR/?1000019277&product=WM

Un petit truc pour le test : SI pos.Latitude <> 0 ET pos.Longitude <> 0 ALORS, je mettrais _ET_ plutôt que ET.
C'est pas grand chose mas c'est de l'optimisation. Si la latitude = 0 alors le test se termine immédiatement sans chercher à tester la longitude...

Merci pour le petit cadeau. Cela peut-être utile.

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Message modifié, 18 mars 2017 - 06:41
Membre enregistré
77 messages
Posté le 07 février 2018 - 20:30
Bonjour,
je déterre le sujet mais moi aussi sur android c'est très lent et on atteint même le timeout par défaut de temps en temps même cela fonctionne très mal
Et ce même sur un code ultra simple pour test:

Clic sur le bouton:

maPosition est une géoPosition
maPosition= GPSRécupèrePosition()

Et dans un thread secondaire persistant appelé par un timer toutes les minutes.... ben du coup ça revoie 0.000 , 0.000 car trop long!!!

Ca fonctionne qu'une fois sur 2 et c'est ultra lent!!! pas de retour de PCSOFT ?
Je suis très en colère qu'une fonction basique comme celle ci ne fonctionne pas.( apparemment pas de code particulier à faire sur Android)..
2000€ la licence j'ai les boules...
Pour récupérer une position toutes les minutes en dans un threadpersistant je galère c'est quand même incroyable!!!
Je ne suis pas le seul apparemment, quelqu'un a t il une solution? J’attends une réponse de PCSOFT... mais rien pour l'instant

Cordialement
julien
Posté le 07 février 2018 - 22:52
Salut Julien,
Actuellement sur Android il y a selon les Puces le plus courament
GPS(États-Unis), Assisted GPS, ou A-GPS(Wifi ou Data Mobiles) et GLONASS(Russe)
Bientôt il y aura Galileo(europeen), Beidou-2(Chine), IRNSS(Inde) ou QZSS(Japon)

En java il existe https://developer.android.com/reference/android/location/GpsStatus.html…()
qui determine le temps nécessaire pour déterminer la premiere localisation

Il faut savoir que le A-GPS est le plus rapide, le plus courant mais moins précis
il existe une propriété ..Valide pour vérifier que la localisation a était déterminée de façon correcte
il existe une application https://play.google.com/store/apps/details…

Je te conseil de lire http://developer.sonymobile.com/knowledge-base/technologies/glonass/

Le mieux est donc de vérifier l’état du gps, du réseau wifi et data
dans un premier temps initialiser en réseau la géolocalisation puis si tu a besoin de plus de précision d'initialiser en satellite
(tu remarquera que souvent en satellite tu n'as pas de position valide car peu d'appareils ont réellement cette option)
Posté le 07 février 2018 - 23:09
J'ai oublier d'ajouter que selon les puces certaines ne fonctionne pas en intérieur mais seulement en extérieur
Posté le 08 février 2018 - 09:34
Julien DETO a écrit :
Bonjour,
je déterre le sujet mais moi aussi sur android c'est très lent et on atteint même le timeout par défaut de temps en temps même cela fonctionne très mal
Et ce même sur un code ultra simple pour test:

Clic sur le bouton:

maPosition est une géoPosition
maPosition= GPSRécupèrePosition()

Et dans un thread secondaire persistant appelé par un timer toutes les minutes.... ben du coup ça revoie 0.000 , 0.000 car trop long!!!

Ca fonctionne qu'une fois sur 2 et c'est ultra lent!!! pas de retour de PCSOFT ?
Je suis très en colère qu'une fonction basique comme celle ci ne fonctionne pas.( apparemment pas de code particulier à faire sur Android)..
2000€ la licence j'ai les boules...
Pour récupérer une position toutes les minutes en dans un threadpersistant je galère c'est quand même incroyable!!!
Je ne suis pas le seul apparemment, quelqu'un a t il une solution? J’attends une réponse de PCSOFT... mais rien pour l'instant

Cordialement
julien


C'est probablement parce que vous testez la fonction depuis votre bureau donc en intérieur. Et il est probable que le signal GPS passe mal dans ce cas. Cela peut venir aussi du paramétrage que vous avez choisi dans GPSInitParametre (localisation précise ou non).
Posté le 08 février 2018 - 11:05
Bonjour et merci pour vos réponses.
Je précise un peu mon problème:
Dans l'initialisation du projet:
*********
*initgpsparametres en auto, précision élevée, énergie élevé.

Threadexecute.(procthread)
Threadpersistant avec notification associée pour exécuter en tâche de fond

***********

*procthread()

Procedure interne envoi()
Maposition est une geoposition
Maposition = gpsrecupereposition(30 s)
Si erreurdetectee = faux alors
Fichierdonneeserveur. Lat=Maposition..latitude
Fichierdonneeserveur. Long=Maposition..longitude
Fin
Fin

Timersys(envoi, 60 s)

varenvie est un booleen=vrai
Tantque varenvie alors
.
.
.
Si condition arrêt alors
varenvie=faux
Fin
Fin


A ce stade lorsque que l'application est ouverte en premier plan ou en arrière plan j'ai bien une prise de position toutes les minutes. Même si l'effet bloquant de gpsrecupereposition en premier plan avec le sablier immobilise l'application ce qui est pénible faudra trouver une solution mais c'est un autre probleme. Je peux même fermer la fenêtre cela fonctionne toujours à la minute grâce au Threadpersistant quand j'utilise le téléphone... Pas en veille
Mais quand le téléphone passe en veille je n'ai que prise de position toutes les 5 ou 6 minutes !!! Je ne sais pas l'expliquer.
.
Je précise que je ne veux pas utiliser geosuiviprocedure qui est imprécise et timing aléatoire en fonction de la vitesse et de la position et gpssuitdeplacement nécessite premier plan et consomme beaucoup trop de batterie.
J'ai juste besoin de prendre un point toute les minutes en tâche de fond sans condition de vitesse de déplacement ou autre...
Merci d'avance
Cdlt
Julien.
Membre enregistré
77 messages
Posté le 08 février 2018 - 11:09
Bonjour et merci pour vos réponses.
Je précise un peu mon problème:
Dans l'initialisation du projet:
*********
*initgpsparametres en auto, précision élevée, énergie élevé.

Threadexecute.(procthread)
Threadpersistant avec notification associée pour exécuter en tâche de fond

***********

*procthread()

Procedure interne envoi()
Maposition est une geoposition
Maposition = gpsrecupereposition(30 s)
Si erreurdetectee = faux alors
Fichierdonneeserveur. Lat=Maposition..latitude
Fichierdonneeserveur. Long=Maposition..longitude
Fin
Fin

Timersys(envoi, 60 s)

varenvie est un booleen=vrai
Tantque varenvie alors
.
.
.
Si condition arrêt alors
varenvie=faux
Fin
Fin


A ce stade lorsque que l'application est ouverte en premier plan ou en arrière plan j'ai bien une prise de position toutes les minutes. Même si l'effet bloquant de gpsrecupereposition en premier plan avec le sablier immobilise l'application ce qui est pénible faudra trouver une solution mais c'est un autre probleme. Je peux même fermer la fenêtre cela fonctionne toujours à la minute grâce au Threadpersistant quand j'utilise le téléphone... Pas en veille
Mais quand le téléphone passe en veille je n'ai que prise de position toutes les 5 ou 6 minutes !!! Je ne sais pas l'expliquer.
.
Je précise que je ne veux pas utiliser geosuiviprocedure qui est imprécise et timing aléatoire en fonction de la vitesse et de la position et gpssuitdeplacement nécessite premier plan et consomme beaucoup trop de batterie.
J'ai juste besoin de prendre un point toute les minutes en tâche de fond sans condition de vitesse de déplacement ou autre...
Merci d'avance
Cdlt
Julien

--
Debutant
Posté le 08 février 2018 - 12:21
Vous pouvez déjà utiliser la fonction GPSDernièrePosition à l'ouverture de l'application pour récupérer la dernière position connue (c'est ce que fait Google Maps). Son exécution est immédiate.

Apres je ne sais pas ce que vous voulez faire mais si vous voulez suivre avec précision la position de l'appareil, il faut utiliser la fonction GPSSuitDéplacement.

NB : il est normal d'avoir moins de notification de position lorsque le téléphone est en veille car l'os réduit considérablement les fonctions de géolocalisation pour économiser la batterie.
Posté le 14 février 2018 - 15:22
Bjr,

Dans son message précédent, Julien DETO a écrit :
Bonjour et merci pour vos réponses. Je précise un peu mon problème:
Dans l'initialisation du projet:
*********
*initgpsparametres en auto, précision élevée, énergie élevé.

Threadexecute.(procthread) Threadpersistant avec notification associée pour
exécuter en tâche de fond

***********

*procthread()

Procedure interne envoi() Maposition est une geoposition
Maposition = gpsrecupereposition(30 s) Si erreurdetectee = faux alors
Fichierdonneeserveur. Lat=Maposition..latitude
Fichierdonneeserveur. Long=Maposition..longitude
Fin
Fin

Timersys(envoi, 60 s)

varenvie est un booleen=vrai
Tantque varenvie alors
. . . Si condition arrêt alors
varenvie=faux
Fin
Fin


A ce stade lorsque que l'application est ouverte en premier plan ou en
arrière plan j'ai bien une prise de position toutes les minutes. Même si
l'effet bloquant de gpsrecupereposition en premier plan avec le sablier
immobilise l'application ce qui est pénible faudra trouver une solution mais
c'est un autre probleme. Je peux même fermer la fenêtre cela fonctionne
toujours à la minute grâce au Threadpersistant quand j'utilise le
téléphone... Pas en veille
Mais quand le téléphone passe en veille je n'ai que prise de position toutes
les 5 ou 6 minutes !!! Je ne sais pas l'expliquer. .
Je précise que je ne veux pas utiliser geosuiviprocedure qui est imprécise et
timing aléatoire en fonction de la vitesse et de la position et
gpssuitdeplacement nécessite premier plan et consomme beaucoup trop de
batterie. J'ai juste besoin de prendre un point toute les minutes en tâche de
fond sans condition de vitesse de déplacement ou autre... Merci d'avance
Cdlt
Julien


Si tu es avec de l'android 7 ou 8 il faut preciser que tu ne veux pas
d'economie d'energie pour ton appli.
Peut etre ca ira mieux.

a plus

--
-------------------------------------------------------------
www.ctc-soft.com
Gestion biblo-documentaire (free-share)
Comptabilité shareware
Logiciels de Gestion de saisie terrain
Spécialisé Tournées de boulangers
-------------------------------------------------------------
Membre enregistré
77 messages
Posté le 14 février 2018 - 16:05
Merci oui mais dans le code ?
Car au niveau réglage téléphone j'ai tout vérifié il n'y a pas de mode économique sur mon appli
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 15 février 2018 - 04:31
Bonjour,

Je suis dans le même cas que Julien, je trouve la fonction d'une lenteur incroyable. A croire qu'il attend le timeout pour renvoyer une info. Et de temps ça ne récupère même pas la position. Une véritable catastrophe.

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Membre enregistré
77 messages
Posté le 15 février 2018 - 08:41
Salut j'ai un peu réglé le problème de la lenteur, et empêché d'immobiliser la fenêtre principale, je te ferai parvenir l'information.
Par contre très toujours pas de réponse de pc soft pour la veille sur batterie... Je prends bien un point toutes les minutes en premier plan en arrière plan et ce même fenêtre de l'application fermee et en veille uniquement sur secteur mais sur Batterie et en veille la prise de points se fait toutes les 5 ou 10 ou 15 min !!!! Incompréhensible !!! Ils me renvoient toujours sur leur 2 fonction de suivi qui ne correspondent pas à mon besoin... J'espère avoir l'information pour la partager sur ce forum car je suis loin d'être le seul dans ce cas. Etucun réglage possible sous Android.... Android
Membre enregistré
217 messages
Popularité : +12 (12 votes)
Posté le 15 février 2018 - 09:02
Bonjour,
Le probleme de lenteur d'acquisition m'intéresse aussi.
Comment avez-vous procédé Julien?
Posté le 15 février 2018 - 09:10
Si le but recherché c'est de récupérer la position de l'appareil toutes les minutes que l'application soit en arrière plan ou pas, l'appareil en veille ou pas ce n'est tout simplement pas possible et en particulier sur les téléphones les plus récents l'os limitant considérablement les fonctionnalités de géolocalisation. Je vous invite à lire cet article à ce sujet :
https://developer.android.com/about/versions/oreo/background-location-limits.html

D'après les essais que j'ai effectué (que ce soit avec WM ou Android Studio), lorsque l'application est au premier plan je reçois une position régulière si le téléphone n'est pas en économie d'énergie et surtout si je suis en extérieur. Des que l'application passe en arrière plan ou pire si l'appareil est en veille, la fréquence des positions reçues est beaucoup plus espacé (plusieurs minutes).