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

API standards et tierces Android Discussion :

Probleme d'utilisation du GPS


Sujet :

API standards et tierces Android

  1. #1
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut Probleme d'utilisation du GPS
    Bonjour,

    J'essaie de faire une application où je dois juste afficher la longitude et la latitude de mon mobile en utilisant le GPS. Voici le stack trace que je reçois :

    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
    04-16 17:03:09.526: WARN/dalvikvm(1263): threadid=3: thread exiting with uncaught exception (group=0x4001e390)
    04-16 17:03:09.526: ERROR/AndroidRuntime(1263): Uncaught handler: thread main exiting due to uncaught exception
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263): java.lang.NullPointerException
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.network.Android.onClick(Android.java:69)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.view.View.performClick(View.java:2364)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.view.View.onTouchEvent(View.java:4179)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.widget.TextView.onTouchEvent(TextView.java:6613)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.view.View.dispatchTouchEvent(View.java:3709)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:924)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1695)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1116)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.app.Activity.dispatchTouchEvent(Activity.java:2068)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1679)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1697)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.os.Handler.dispatchMessage(Handler.java:99)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.os.Looper.loop(Looper.java:123)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at android.app.ActivityThread.main(ActivityThread.java:4595)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at java.lang.reflect.Method.invokeNative(Native Method)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at java.lang.reflect.Method.invoke(Method.java:521)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    04-16 17:03:09.536: ERROR/AndroidRuntime(1263):     at dalvik.system.NativeStart.main(Native Method)
    Le code GPS :

    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
    60
    61
    62
     
     
    import android.location.Criteria;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
     
    public class Gps implements LocationListener {
    	private Location location;
    	private Criteria criteria;
    	private LocationManager locationManager;
     
    	/**
             * constructeur de la classe GPS
             * 
             * @param locationManager
             *            gestionnaire de localisation
             * 
             */
     
    	public Gps(LocationManager locationManager) {
    		this.criteria = new Criteria();
    		this.criteria.setAccuracy(Criteria.ACCURACY_FINE);
    		this.criteria.setAltitudeRequired(false);
    		this.criteria.setBearingRequired(false);
    		this.criteria.setCostAllowed(true);
    		this.criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
    		this.locationManager = locationManager;
    		this.locationManager.requestLocationUpdates(locationManager
    				.getBestProvider(criteria, true), 100, 1, this);
    	}
     
    	public Location getLocation(){
    		return this.location;
    	}
     
    	@Override
    	public void onLocationChanged(Location loc) {
    		// TODO Auto-generated method stub
    		this.location = loc;
    	}
     
    	@Override
    	public void onProviderDisabled(String arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void onProviderEnabled(String arg0) {
    		// TODO Auto-generated method stub
     
    	}
     
    	@Override
    	public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
    		// TODO Auto-generated method stub
     
    	}
     
    }
    l'activité

    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
     
     
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.Drawable;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Gravity;
    import android.view.View;
    import android.widget.Button;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import java.util.Date;
     
    //...
     
    public class Android extends Activity implements View.OnClickListener {
    	private Button btn;
    	private TextView txt;
    	private LinearLayout layout;
    	private Gps gps;
     
    	@Override
    	public void onCreate(Bundle icicle) {
    		super.onCreate(icicle);
    		this.layout = new LinearLayout(this);
     
    		btn = new Button(this);
    		btn.setText("What time is it ! ");
    		btn.setOnClickListener(this);
    		txt = new TextView(this);
     
    		layout.addView(btn);
    		layout.addView(txt);
    		layout.setPadding(50, 50, 0, 0);
    		layout.setOrientation(LinearLayout.VERTICAL);
    		layout.setGravity(Gravity.CENTER);
    		setContentView(layout);
    		this.gps = new Gps((LocationManager)getSystemService(Context.LOCATION_SERVICE));
     
    	}
    //...
    	public void onClick(View view) {
    		if (view == btn) {
    			Log.e("GPS", "long = " + gps.getLocation().getLongitude());
    			Log.e("GPS", "lat = " + gps.getLocation().getLatitude());
    		} else {
    			// kill 
    		}
     
    	}
     
    }
    J'ai ajouté au manifest la permission "android.permission.ACCESS_FINE_LOCATION"

  2. #2
    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
    Salut,

    La récupération des informations GPS n'est pas immédiat, il faut avant chopper le signal. Du coup, peut être qu'entre le moment où tu initialises le GPS et le moment où tu veux les infos, le GPS n'a pas eu le temps...
    C'est le "GetLocation" qui renvoi une valeur null ?

  3. #3
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut
    Oui, c'est au niveau de getLocation().
    Edit : Entre l'initialisation du GPS dans l'évènement onStart de l'activité et l'évènement onClick du bouton il se passe un peu de temps.

  4. #4
    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
    Si je ne me trompe pas, tu dois avoir moyen de savoir si la géolocalisation à fini de récupérer les infos...
    De plus, tu peux également demandé où s'est fait le dernier fix :
    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 void requestLocation(Activity aActivity, LocationListener aLocationListener) {
    		m_LocationListener = aLocationListener;
     
    		LocationManager myLocationManager = (LocationManager) anActivity.getSystemService(Context.LOCATION_SERVICE);
     
    		myLocationManager.requestLocationUpdates(
    				LocationManager.GPS_PROVIDER, 
    				60000, 
    				500, 
    				m_LocationListener);   	
                    //Dans un premier temps, on demande où s'est fait le dernier fix
    		Location location = myLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    		if (location != null) {
    			m_LocationListener.onLocationChanged(location);
    		}
     
    	}
    dans cette exemple, on ajoute un "locationlistener" qui permettra de savoir quand le fix a réellement eu lieu, et il te remontera les infos si une position est remontée.
    Tu peux également être encore plus fin, du style :
    1) je lance l'initialisation du GPS
    2) je demande au GPS où s'est fait le dernier fix
    3) si y'a pas eu de dernier fix, je demande au GPS de me donner ma localisation via le "Network_provider" (ça sera beaucoup moins précis, mais ça donne déjà une idée).

    Tu dois avoir ce genre d'exemples sur google (dans la partie map).

  5. #5
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut
    La localisation ne change pas. J'ai toujours le couple (0.0,0.0) comme latitude et longitude. J'ai dans le logCat au niveau du tag CalendarProvider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    updateLocal: USA
    Local doosn't change so return it 
    ...
    ...

  6. #6
    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
    met des traces dans tes méthodes qui détectent tous changements au niveau de ton listener pour le GPS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void onLocationChanged(Location loc);
    public void onProviderDisabled(String arg0);
    public void onProviderEnabled(String arg0);
    public void onStatusChanged(String arg0, int arg1, Bundle arg2);
    Et regarde bien par où il passe. Attends un peu pour voir si il arrive à chopper le signal... Tu vois le petit icône satellite dans le barre en haut qui s'active quand tu lance ton initialisation ?

  7. #7
    Membre très actif Avatar de _Xavier_
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2009
    Messages : 311
    Par défaut
    L'icône du GPS apparait et clignote mais il n'y a aucune trace dans les évènements. Je commence à craindre que le problème soit plutôt lié au matériel.

  8. #8
    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
    C'est long à obtenir un fix avec les satellites, surtout que tu demandes une précision assez importante (si je ne me trompe pas).

    Sur une application standard (style gmaps, ou autres applications GPS que tu pourrais trouver sur android market), tu arrives à obtenir un fix ?

  9. #9
    Membre confirmé Avatar de cad13
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 247
    Par défaut
    Question bête : c'est sur ton téléphone ou avec l'émulateur que tu testes ton programme ?

    Essaie ce code qui fait un peu ce que tu veux (les coordonnées sont affichées à l'écran) :
    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
    public class LocationSampleActivity extends Activity {
     
    	private EditText latitude;
    	private EditText longitude;
     
     
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
     
     
            latitude=(EditText) findViewById(R.id.latitude);
            longitude=(EditText) findViewById(R.id.longitude);
     
        }
     
        private void registerListener(){
        	LocationManager locMngr = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            List<String> providers = locMngr.getAllProviders();
     
            locMngr.requestLocationUpdates(providers.get(0), 0, 0, new LocationListener(){
    			@Override
    			public void onLocationChanged(Location loc) {
    				latitude.setText(loc.getLatitude()+"");
    		        longitude.setText(loc.getLongitude()+"");			
    			}
     
    			@Override
    			public void onProviderDisabled(String provider) {
    			}
     
    			@Override
    			public void onProviderEnabled(String provider) {
    			}
     
    			@Override
    			public void onStatusChanged(String provider, int status,
    					Bundle extras) {
    			}        	
            }); 
        }
     
    }

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/01/2007, 21h51
  2. Probleme d utilisation de template dans le cpp
    Par Math75 dans le forum Langage
    Réponses: 2
    Dernier message: 07/10/2005, 16h26
  3. [Système][Environnement] Problème d'utilisation?!?
    Par waldo2188 dans le forum Général Java
    Réponses: 5
    Dernier message: 23/03/2005, 17h18
  4. Probleme d'utilisation de directX 9 avec visual studio.net
    Par cranedoeuf dans le forum DirectX
    Réponses: 1
    Dernier message: 24/05/2004, 04h33
  5. [Debutant] probleme pour utiliser les classes d'un .jar
    Par pissek dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 12/05/2004, 18h21

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