2010-11-14 4 views
4

Je fais une application qui utilise le récepteur GPS. L'application fonctionnera sur toutes les versions à partir de 1.6. J'ai une icône satellite dans lequel je dis aux utilisateurs l'état actuel:Android GPS Status me rend fou

  • si l'icône est rouge - gps désactivé
  • si l'icône est orange - GPS est activé et essayer de fixer sur les satellites
  • si l'icône est verte - le GPS est fixe et fonctionne correctement.

Après avoir lu ici, j'ai trouvé que certains événements déclencheur OnLocationChanged sur la version 1.6, mais plus tard, afin de prendre les conseils que je mis en place un auditeur GPS. J'ai un comportement vraiment bizarre car le statut de l'icône est désorganisé. Par exemple, j'active le GPS et devient orange ... après un vert fixe .. après quelques secondes se lit après une seconde orange et ainsi de suite ...

Voici le code que j'utilise. S'il vous plaît suggérer quoi changer

public class TrackExecutionActivity extends Activity{ 

protected static final long GPS_UPDATE_TIME_INTERVAL=3000; //millis 
protected static final float GPS_UPDATE_DISTANCE_INTERVAL=0; //meters 
private LocationManager mlocManager; 
private MyGPSListener mGpsListener; 
private LocationListener mlocListener; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.trackexecution); 

     imgGpsState = (ImageView)findViewById(R.id.imgGpsState); 
     mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
     mlocListener = new MyLocationListener(); 
     mGpsListener = new MyGPSListener(); 
} 

private class MyGPSListener implements GpsStatus.Listener { 
     public void onGpsStatusChanged(int event) { 
      boolean isGPSFix = false; 
      switch (event) { 
       case GpsStatus.GPS_EVENT_SATELLITE_STATUS: 
        if (mLastLocation != null) 
         isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < GPS_UPDATE_TIME_INTERVAL * 2; 

        if (isGPSFix) { // A fix has been acquired. 
         imgGpsState.setImageDrawable(ctx.getResources().getDrawable(R.drawable.gps_on_green)); 
        } else { // The fix has been lost. 
         imgGpsState.setImageDrawable(ctx.getResources().getDrawable(R.drawable.gps_on_orange)); 
        } 

        break; 

       case GpsStatus.GPS_EVENT_FIRST_FIX: 
        imgGpsState.setImageDrawable(ctx.getResources().getDrawable(R.drawable.gps_on_green)); 
        break; 
       case GpsStatus.GPS_EVENT_STARTED: 
        imgGpsState.setImageDrawable(ctx.getResources().getDrawable(R.drawable.gps_on_orange)); 
        break; 
       case GpsStatus.GPS_EVENT_STOPPED: 
        imgGpsState.setImageDrawable(ctx.getResources().getDrawable(R.drawable.gps_on_red)); 
        break; 
      } 
     } 
    } 

public class MyLocationListener implements LocationListener 
    { 
     public void onLocationChanged(Location location) 
     { 
      if (location != null) { 
         mLastLocationMillis = SystemClock.elapsedRealtime(); 
      // do some things here 
        mLastLocation = location; 

     } 
     public void onProviderDisabled(String provider) 
     { 
      imgGpsState.setImageDrawable(ctx.getResources().getDrawable(R.drawable.gps_on_red)); 
     } 

     public void onProviderEnabled(String provider) 
     { 
      imgGpsState.setImageDrawable(ctx.getResources().getDrawable(R.drawable.gps_on_orange)); 
     } 

     //this doesn't trigger on Android 2.x users say 
     public void onStatusChanged(String provider, int status, Bundle extras) 
     { 
     } 
     } 
     } 

@Override 
    protected void onResume() { 
    if(mlocManager != null) { 
     if (mGpsListener == null) 
     { 
      mGpsListener = new MyGPSListener(); 
     } 

     if (mlocListener == null) 
     { 
      mlocListener = new MyLocationListener(); 
     } 

     mlocManager.addGpsStatusListener(mGpsListener); 
     mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_UPDATE_TIME_INTERVAL, GPS_UPDATE_DISTANCE_INTERVAL, mlocListener); 
     } 
     super.onResume(); 
    } 
} 

Répondre

7

changement ceci:

isGPSFix = (SystemClock.elapsedRealtime() - mLastLocationMillis) < GPS_UPDATE_TIME_INTERVAL * 2; 

votre sont la fixation d'un booléen avec des valeurs non booléennes .. d'où le comportement de l'icône bizarre lors des corrections de GPS, vous devez définir cette isGPSfix booléen quelque part. . pour le cas de hasGPSfix ou doesnothaveGPSfix ..

Vous pourriez avoir signifié:

if ((SystemClock.elapsedRealtime() - mLastLocationMillis) < GPS_UPDATE_TIME_INTERVAL * 2) { 
    isGPSFIX = true; 
} 
+0

A travaillé comme un rêve. Intéressant, je n'aurais pas pensé à ça. Merci de votre aide. – Alin