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 lManager.getLastKnownLocation


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 59
    Par défaut Problème avec lManager.getLastKnownLocation
    Dans mon app j'ai une activité qui permet de laisser un commentaire avec nom et date. Tout cela fonctionne parfaitement. J'ai décidé de rajouter la ville au commentaire et ai donc ajouté des fonctions simples pour faire cela.
    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
    	public class CommentsActivity extends Activity  {
     
    	private SingleComment comment_to_record = null;
    	private LocationManager lManager;
    	private Location location;
    	private String choix_source = null;
    	private String localisation = null;
     
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    		setContentView(R.layout.lay_submit_comments);
     
    		comment_to_record = new SingleComment();
    		lManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    	}
    Le soucis est dans la méthode obtenirPosition() voir code ci-dessous :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    	private String doLocation() {
    		setProgressBarIndeterminateVisibility(true); // on démarre le cercle de chargement
    		location = obtenirPosition();
    		// Le geocoder permet de récupérer ou chercher des adresses
    		// gràce à un mot clé ou une position
    		Geocoder geo = new Geocoder(getApplicationContext());
    		try {
    			// Ici on récupère la premiere adresse trouvée gràce à la position
    			// que l'on a récupérée
    			List<Address> adresses = geo.getFromLocation(
    					location.getLatitude(), location.getLongitude(), 1);
     
    			if (adresses != null && adresses.size() == 1) {
    				Address adresse = adresses.get(0);
    				// Si le geocoder a trouver une adresse, alors on l'affiche
    				localisation = adresse.getLocality();
    				// Si l'adresse est nulle on affiche la parenthèse
    				if (localisation == null) {
    					localisation = " ( . . . ) ";
    				}
     
    			} else {
    				// sinon on affiche un message d'erreur
    				Toast.makeText(getApplicationContext(),
    						String.format("L'adresse n'a pu être déterminée"),
    						Toast.LENGTH_SHORT).show();
    				localisation = "( . . . )";
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    			Toast.makeText(getApplicationContext(),
    					String.format("L'adresse n'a pu être déterminée"),
    					Toast.LENGTH_SHORT).show();
    			localisation = "( . . . )";
    		}
    		setProgressBarIndeterminateVisibility(false);
    		return localisation;
    	}
     
    	private String choisirSource() {
    		choix_source = LocationManager.NETWORK_PROVIDER;
    		// On demande au service la liste des sources disponibles.
    		List<String> providers = lManager.getProviders(true);
    		Iterator<String> i = providers.iterator();
    		while (i.hasNext()) {
    			String provider = (String) i.next();
    			if (provider.equals(LocationManager.GPS_PROVIDER)) {
    				choix_source = LocationManager.GPS_PROVIDER;
    			}
    		}
    		return choix_source;
    	}
     
    	private Location obtenirPosition() {
    		choix_source = choisirSource();
    		location = lManager.getLastKnownLocation(choix_source);////////////// ICI!!!
    		return location;
    	}
    	}
    Avec le debugger j'ai repèré que location était null même après l'execution de getLastKnownLocation(choix_source) alors que choix_source est bien défini.

    Toutes idées bienvenues.
    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
    Si tu lis bien la description de la fonction getLastKnownLocation() il est indiqué qu'elle peut retourner un objet null. Cela provient du fait qu'il n'y a eu aucune position enregistrée précédemment. (Je suppose que tu utilises l'émulateur)

  3. #3
    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
    Il y a deux choses:

    1. Demander une location, c'est une opération typiquement asynchrone... Si c'est pour l'obtention d'une ville, il n'ya pas besoin d'avoir une position très précise et une simple localisation "réseau" suffit (pas besoin d'avoir le GPS quoi). Mais dans tous les cas, c'est une demande de mise à jour asynchrone.

    2. Demander la dernière localisation connue, peut renvoyer une position nulle...

    Reste à savoir si la localisation est nécessaire dans l'application ou non, si elle est nécessaire, il "suffit" de ne pas proposer l'envoi tant qu'on n'a pas une localisation (soit par 2 soit par 1)
    Si ce n'est pas nécessaire, alors utiliser 1 de toute manière histoire de mettre à jour la localisation, et utiliser 2 lors de l'envoi (et ne pas rajouter la ville si null).

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 59
    Par défaut Résolu
    Merci pour vos réponses.
    Simon m'a mis sur une piste.
    J'ai trouvé la solution sur le bon vieux StackOverflow :

    "It returns 'null', when the Service is disabled in Settings > Location and Security > location through network

    So that can happen quite often."

    Je teste sur mon Nexus S et en lisant ça je me suis souvenu avoir récemment décoché Paramètres/Services de localisation/Services de localisation.
    Case cochée ça fonctionne nickel. Pour le fait que le gps n'est pas utile pour cela je suis ok mais pourquoi ne pas l'utiliser s'il est activé?

    Je stocke les commentaires dans une base sqlite et ais mit la colonne localisation(ville) a not null. J'ai donc modifier mon code pour renvoyer une String "neutre" si localisation est null.

    Merci de votre réactivité.
    A bientôt.

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 59
    Par défaut résolu?
    Ou est la balise résolu?

+ Répondre à la discussion
Cette discussion est résolue.

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