2012-04-03 10 views
1

Ich untersuche GPS-Standort auf Samsung Galaxy2 (Android 2.3.5). SG2 unterstützt A-GPS, also habe ich GPS, Wifi-Netzwerk und Sensor aktiviert. Es sieht gut aus, aber manchmal gibt das GPS einen völlig anderen Standort, mehr als 50km von meinem jetzigen Platz entfernt. Auch der Standort ändert sich oft, obwohl ich einfach nur einen Punkt aufgelegt und nie berührt habe.Falsche GPS-Position auf Samsung Galaxy2

Ich bin noch neu bei Android, also ich bin mir nicht sicher, was dieses Problem verursacht. Unten ist der Quellcode, der den GPS-Standort behandelt .:

public class LocationMonitor extends Service implements LocationListener,Runnable { 
    .... other local variables here 

    Object locationUpdateNotifier= null; 
    public static GeoPoint ourLocation; 


    public void synchronize() 
    { 
     if(ourLocation == null) 
     { 
      ourLocation = getLastKnownLocation(); 
      if(ourLocation == null) return; 
     } 

     //Load last time we synced 
     long lastSyncTime = some_value; 

     if(lastSyncTime < System.currentTimeMillis() - UPDATE_FREQ) //UPDATE_FREQ - default 30 minutes 
     { 
      handler.post(new Runnable() { 
       public void run() { 
        GpsPingTask pingTask = new GpsPingTask(context,String.valueOf(ourLocation.getLatitudeE6()/1E6),String.valueOf(ourLocation.getLongitudeE6()/1E6)); 
        pingTask.execute((Void)null); //Send location to server 
       } 
      }); 
      lastSyncTime = System.currentTimeMillis(); 
      //Save new lastSync time 
     } 
    } 



    public void kill() 
    { 
     if(locationManager !=null) 
      locationManager.removeUpdates(this); 
    } 

    public void onLocationChanged(Location location) { 
     try 
     { 
      //Read latitude and longitude from location 
      //Create Geo point so we can get a english street name address 
      ourLocation = new GeoPoint((int)(location.getLatitude()*1E6),(int)(location.getLongitude()*1E6)); 

      if(locationUpdateNotifier != null) 
      { 
       synchronized (locationUpdateNotifier) { 
        locationUpdateNotifier.notify(); 
       } 
      } 

      if(!doneFirstUpdate) 
      { 
       doneFirstUpdate =true; 
       Log.i("LocationMointor", "LocationMonitor.onLocationChanged() done first update at 0 frequency, resetting to normal speed"); 
       //Set it to update at the requested frequency 
       resetLocationUpdatesFreq(); 
      } 

      startSynchronizeThread(); 
     } 
     catch (Throwable e) { 
      Log.i("LocationMointor", "LocationMonitor.onLocationChanged(): " + e); 
     } 
    } 


    public void onProviderDisabled(
      String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) {} 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 


    public void setTemporaryLocationUpdateFreq(int pingFreqSecs) { 

     setTemporaryLocationUpdateFreq(pingFreqSecs, 10); 
    } 


    public void setTemporaryLocationUpdateFreq(int pingFreqSecs, int minimumDistanceMeters) { 
     if(!doneFirstUpdate) 
      doneFirstUpdate =true; 

     tempLocationUpdateFreq = pingFreqSecs; 
     tempLocationUpdateMeters = minimumDistanceMeters; 
     handler.post(new Runnable() 
     { 
      public void run() { 
       //Turn of location updates 
       if(locationManager !=null) 
        locationManager.removeUpdates(locationMonitor); 
       //Restart location updates with new frequency 
       locationManager.requestLocationUpdates(getGpsMode(), UPDATE_FREQ, tempLocationUpdateMeters,locationMonitor); 
       //locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, tempLocationUpdateFreq*1000, tempLocationUpdateMeters,locationMonitor); 
      } 
     }); 
    } 

    private void startSynchronizeThread() { 
     if(!running) 
      new Thread(this).start(); 
    } 


    public void resetLocationUpdatesFreq() { 
     locationUpdateNotifier = null; 
     handler.post(new Runnable() 
     { 
      public void run() { 
       //Turn of location updates 
       if(locationManager !=null) { 
        locationManager.removeUpdates(locationMonitor); 
        //Restart location updates with default location update frequency 
        //locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATE, MINIMUM_DISTANCECHANGE_FOR_UPDATE,locationMonitor); 
       } 
      } 
     }); 
    } 


    public void setLocationUpdateFreq(int pingFreqMins) { 

     Log.i("LocationMointor", "LocationMonitor.setLocationUpdateFreq().mode: " + getGpsMode() + "pingFreq:" + pingFreqMins); 

     //Save new frequency value 
     SharedPreferences pref = context.getSharedPreferences(PREF_PING_FREQ, Context.MODE_PRIVATE); 
     Editor prefEditor= pref.edit(); 
     prefEditor.putInt(PREF_PING_FREQ, 10); 
     prefEditor.commit(); 
     handler.post(new Runnable() 
     { 
      public void run() { 
       //Turn of location updates 
       if(locationManager !=null) 
        locationManager.removeUpdates(locationMonitor); 
       //Restart location updates with new piong frequency 
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MINIMUM_TIME_BETWEEN_UPDATE, MINIMUM_DISTANCECHANGE_FOR_UPDATE,locationMonitor); 
      } 
     }); 

    } 


    public void addUpdateNotify(Object notifyable) 
    { 
     this.locationUpdateNotifier = notifyable; 
    } 


    public GeoPoint getLastKnownLocation() 
    { 
     Criteria crit = new Criteria(); 
     //Try get last known fine location 
     crit.setAccuracy(Criteria.ACCURACY_FINE); 
     String provider = locationManager.getBestProvider(crit, false); 
     Location loc = locationManager.getLastKnownLocation(provider); 
     //If we got no location, try coarse location 
     if(loc == null) 
     { 

      crit.setAccuracy(Criteria.ACCURACY_COARSE); 
      provider = locationManager.getBestProvider(crit, false); 
      loc = locationManager.getLastKnownLocation(provider); 
      //If nothing, return nothing 
      if(loc == null) 
      { 
       Log.i("LocationMointor", "LocationMonitor.getLastKnownLocation() got no location"); 
       return null; 
      } 
     } 

     //Create geopoint and return it. 
     GeoPoint geoPoint = new GeoPoint((int)(loc.getLatitude()*1E6),(int)(loc.getLongitude()*1E6)); 
     Log.i("LocationMointor", "LocationMonitor.getLastKnownLocation() got " +geoPoint); 

     return geoPoint; 
    } 

    @Override 
    public void run() { 
     running = true; 
     Object pauser = new Object(); 
     do{ 
      try 
      { 
       synchronize(); 
       synchronized(pauser) 
       { 
        pauser.wait(UPDATE_FREQ); 
       } 

      } 
      catch(Throwable ex) 
      { 
       Log.e("LocationMointor", "LocationMonitor.run() " +ex); 
      } 
     } 
     while(running); 
    } 

    public void onCreate() { 
     super.onCreate(); 

     this.context = this; 
     this.locationMonitor= this; 

     handler = new Handler(); 

     //Get the location manager service 
     locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE); 

     //Start gps to get our location 
     this.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, UPDATE_FREQ, this); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     kill(); 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return mBinder; 
    } 

    private final IBinder mBinder = new MyBinder(); 

    public class MyBinder extends Binder { 
     public LocationMonitor getService() { 
      return LocationMonitor.this; 
     } 
    } 
} 

Würden Sie mir bitte helfen, dieses Problem zu lösen? Vielen Dank im Voraus.

Antwort

2

Im Gegensatz zum ursprünglichen Galaxy S-Telefon funktioniert das GPS des GS2 einwandfrei.

Ausgehend von Ihrem Code verwenden Sie getLastKnownLocation und fallen auf Grob zurück, wenn GPS nicht verfügbar ist. Also ich denke, das ist genau das, was passiert: - Sie erhalten entweder eine sehr veraltete GPS-Position - oder eine grobe Position und Google nicht Ihre Gegend sehr gut zuordnen, so dass es aus ist.

Sie können diese Annahmen überprüfen, indem Sie Protokolle hinzufügen oder den Anbieter und den Zeitstempel des Nicht-Null-Standortobjekts überprüfen, das Sie von getLastKnownLocation() erhalten.

+0

Danke für den Punkt. Das erwarte ich von dieser guten Community. – sunghun

+0

Großartig. Denken Sie daran, die beste Antwort zuzuweisen. –

0

Wenn Sie den Standort auf einem echten Gerät überprüfen und Sie an der gleichen Stelle bleiben, merke ich selbst, dass es ein wenig vom Standort abweichen kann (Sie sehen dies auch in GPS-Software, die nicht weiß, in welche Richtung Sie sind schauen, bevor Sie fahren/sich bewegen). Eine kleine Änderung der Lage ist möglich, aber normalerweise nicht 50km. Haben Sie ein anderes Gerät zu testen, ob dieses Problem der 50 km gerätabhängig ist?

+0

Ich werde bald andere Geräte haben. – sunghun