IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Problème avec LocationListener


Sujet :

Android

  1. #1
    Membre averti
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Par défaut Problème avec LocationListener
    Bonjour !

    Je suis en train de développer une appli utilisant la géolocalisation, afin d'afficher des points d’intérêts à proximité de l'utilisateur.
    J'ai fais la partie point d'intérêt, affichage sur la carte, boutons de zoom (), passage map / satellite... En gros, il ne me manque plus que la géoloc !

    Malheureusement, je n'arrive pas à m'en sortir avec le LocationListener... J'ai tenté pas mal de tuto, mais soit ils ne sont pas très clairs, soit ils ne fonctionnent pas

    J'ai ma classe principale, je créé une classe qui implémente LocationListener.
    - Pour onLocationChanged(Location location) : je récupère latitude et longitude avec les getters * 1E6, puis je set un new GeoPoint avec ces infos.

    - Pour onProviderDisabled et onProviderEnabled : juste un petit Toast pour le moment

    - Pour onStatusChanged : rien pour le moment


    Dans ma chronologie, je veux que la mapView soit centrée sur la dernière position connue, pendant que le LocationListener fait le fix, puis passe les nouvelles coordonnées à mon mapController.

    Je sais que mon problème est un peu bête, mais je n'arrive pas à suivre cette chronologie...

    Un peu d'aide ? Un bon tuto ?
    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Voici le flow que tu cherches :

    1) getLastKnownLocation(String provider)
    2) Si non nul -> créer le point et centrer la map
    3) requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)
    4) Dès que onLocationChanged(Location location) est appelé : removeUpdates(LocationListener listener) pour arrêter la recherche, créer le point, centrer la map.


    http://developer.android.com/guide/t...trategies.html

  3. #3
    Membre averti
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Par défaut
    Merci de ton aide.

    En fait, j'ai un soucis avec mon locationProvider.
    Voici un extrait de mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    private LocationManager locationManager;
    	private LocationListener locationListener;
    	private LocationProvider locationProvider;
    	private Location actualLocation, lastLocation;
     
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		mapView = (MapView) findViewById(R.id.mapView);
    		niceGP = new GeoPoint(43699651, 7227173);
    		perpignanGP = new GeoPoint(42698586, 2898559);
     
    		// essai de localisation
    		// http://developer.android.com/guide/topics/location/strategies.html
    		locationManager = (LocationManager) this
    				.getSystemService(Context.LOCATION_SERVICE);
    		locationListener = new LocationListener() {
     
    			public void onStatusChanged(String provider, int status,
    					Bundle extras) {
    			}
     
    			public void onProviderEnabled(String provider) {
    			}
     
    			public void onProviderDisabled(String provider) {
    			}
     
    			public void onLocationChanged(Location location) {
    			}
    		};
    		locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,
    				0, locationListener);
    		locationProvider = LocationManager.GPS_PROVIDER;
    Eclipse me dit, concernant cette dernière ligne :

    Type mismatch: cannot convert from String to LocationProvider
    J'aimerais mettre tout ce qui concerne l'acquisition du GPS dans une autre classe, et l'appeller uniquement au besoin...

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2012
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2012
    Messages : 46
    Par défaut
    Bonjour,

    Je te conseille ces cours et tutoriels pour apprendre Android que j'ai pour ma part trouvé très clair.

    En espérant que ça puisse t'aider à résoudre ton problème,

    Nylwen

  5. #5
    Membre averti
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Par défaut
    Je ne l'avais pas vu lui !
    Vais lire tout ça, et je posterais mon évolution

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Ta dernière ligne ne veut rien dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    locationProvider = LocationManager.GPS_PROVIDER;
    Qu'essaies-tu de faire ici ?

  7. #7
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Avant de te pencher sur les Services essaye déjà te comprendre comment marche la géolocatisation.

    J'aimerais mettre tout ce qui concerne l'acquisition du GPS dans une autre classe, et l'appeller uniquement au besoin...
    Pour quelle raison, dans quel but ? Les services peuvent répondre a tes besoins mais peuvent également être lour à mettre en place pour le besoin que tu demandes.

    Les listeners peuvent suffire comme un Thread.

  8. #8
    Membre averti
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Par défaut
    Citation Envoyé par Simon MARQUIS Voir le message
    Ta dernière ligne ne veut rien dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    locationProvider = LocationManager.GPS_PROVIDER;
    Qu'essaies-tu de faire ici ?
    [HS]Tiens, je pensais recevoir des mails de notifs...[/HS]

    J'essaie simplement de suivre un tuto (Android developpers je crois)


    @ Feanorin : parce que j'ai appris à créer une classe par objectif, que je trouvais cela plus propre, et que j'ai du mal avec le locationListerner... Alors je me suis dis pourquoi ne pas délocaliser

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Moi je dirais plutôt que tu as inventé cette ligne

  10. #10
    Membre averti
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Par défaut
    Non non :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER;
    // Or, use GPS location data:
    // LocationProvider locationProvider = LocationManager.GPS_PROVIDER;
    http://developer.android.com/guide/t...trategies.html

    Même si des fois j'en ai l'impression, je ne suis pas encore fou hein

    Edit : j'ai trouvé quelque chose de vraiment pas mal ici

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    757
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 757
    Par défaut
    Eh bien c'est la team Android qui a rédigé le cours qui s'est trompé.
    LocationManager.NETWORK_PROVIDER est de type String
    Il ne peut donc pas être casté en LocationProvider.
    Je pense que l'erreur vient simplement du fait que la méthode requestLocationUpdates prend en paramètre un type de Provider comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);

  12. #12
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    @ Feanorin : parce que j'ai appris à créer une classe par objectif, que je trouvais cela plus propre, et que j'ai du mal avec le locationListerner... Alors je me suis dis pourquoi ne pas délocaliser
    , je voulais juste savoir si tu en avais besoin pour pouvoir l'attaquer d'autres part. Pour gérer de la meilleure façon possible, l'utilisation du GPS qui est gourmand sur le smartphone , ...

    Qu'est ce que tu as du mal a comprendre dans les locationListerner ?

    Après le déplacer en effet c'est plus propre .

  13. #13
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Par défaut
    Sinon tu peux aussi t'orienter vers l'utilisation de ce genre de librairie :
    http://code.google.com/p/little-fluf...ation-library/

  14. #14
    Membre averti
    Profil pro
    Développeur JEE & Android
    Inscrit en
    Mars 2004
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur JEE & Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 42
    Par défaut
    Si on ne peut même plus se fier à la team Android

    En fait je commence à en avoir vraiment marre de cette géo loc
    C'est ce qui me manque pour finir ce prog, et comme j'ai (beaucoup) moins de temps libre, ça ne me simplifie pas les choses...

    Pour simplifier au max, je pourrais me contenter de faire une unique géo loc, sans suivi de position... Maintenant, c'est sûr que s'il y a un suivi c'est mieux

    Si je connaissais une personne physique développant sous Android, je l'inviterais à une soirée bière / pizza maison après qu'il m'ait tout expliqué

    @ MrDuChnok : je ne préfère pas utiliser de libs tant que je ne maîtrise pas déjà les bases. Je sais je suis spéciale, mais pour moi se serait comme utiliser Hibernate sans connaitre JDBC...

    @ Feanorin : j'espère que tu as vu que je n'étais pas agressif

  15. #15
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Pourtant ... en général c'est assez simple....

    Un objet "geoloc" qui a deux état: démarré (recoit des updates des services android), ou arrêté....

    A un endroit du code (envoi d'une information geo-taguée) on a besoin de la geo-loc....
    Donc, *avant* l'envoi de l'information (par exemple quand on entre dans l'activité qui va demander à l'utilisateur ce qu'il veut envoyer), on démarre la geo-loc....
    Par voie de conséquence, *après* l'envoi on arrête la geo-loc...

    Maintenant, juste avant l'envoi, on va demander à l'objet de geoloc, quelle est la dernière position connue...
    De deux choses l'une, ou l'information ne nécessité pas forcément de geoloc, alors accepter de recevoir "null" et de pas envoyer l'information (cela ne sert à rien d'inventer des données qu'on n'a pas, il est plus simple/utile de stocker le fait qu'on ne les a pas, et de traiter ce cas pendant l'analyse des données).

    Ou l'information est nécessaire... Dans ce cas, on a une fonction de l'objet geoloc qui permet de faire deux choses: retourner immédiatement la position connue courante, ou enregistrer du code (passé en paramètre) qui devra être être executé dès qu'une position est reçue...
    Coté geoloc donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    class Geolocation
    {
          private ArrayList<Runnnable> toBeNotified = new ArrayList<Runnable>();
          private Position lastKnownPosition = null;
     
          public synchronized start()
          {
               this.lastKnownPosition = LocationManager.getLastKnownPosition();
               // register self for updates...
          }
     
          public synchronized stop()
          {
               // unregister self for updates
          }
     
          public synchronized Position getPositionOrNull()
          {
               return this.lastKnownPosition;
          }
     
          public synchronized Position getPosition(Runnable notificationCode)
          {
               if (this.lastKnownPostion == null)
                   this.toBeNotified.add(notificationCode);
               return this.lastKnownPosition;
          }
     
          // called on each update
          public synchronized onPositionUpdated(Position pos) 
          {
                // refine as in google documentation
                this.lastKnownPosition = pos;
                //
                for (Runnable r : this.toBeNotified)
                     r.run();
                this.toBeNotified.clear();
          }
    }
    Coté client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    class Activity
    {
         public void onCreate()
         {
             Geolocation.start();
         }
     
         public void onDestroy()
         {
             Geolocation.stop();
         }
     
         public void onSendData()
         {
              Position pos = Geolocation.getPosition(new Runnable() {
                    public void run() { 
                          runOnUIThread( new Runnable() { 
                               public void run() { sendData(); } });
                    });
              if (pos == null)
                  showProgressDialog();
              else
                  sendData();
         }      
     
         public void sendData()
         {
             // send data...
             Position pos = Geolocation.getPositionOrNull();
             // sending the data
             ...
             // dismiss dialog
             hideProgressDialog();
         }
    }

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo