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.
Danke für den Punkt. Das erwarte ich von dieser guten Community. – sunghun
Großartig. Denken Sie daran, die beste Antwort zuzuweisen. –