Android 三星Galaxy2上的GPS位置不正确
我正在调查三星Galaxy2(Android 2.3.5)上的GPS定位。SG2支持A-GPS,所以我打开了GPS、Wifi网络和传感器辅助。它看起来工作得很好,但有时GPS给出的位置与我现在的位置完全不同,相距超过50公里。而且位置经常变化,即使我只在电话上放了一个点,从来没有碰过 我对Android还是新手,所以我不确定是什么导致了这个问题。下面是处理GPS位置的源代码:Android 三星Galaxy2上的GPS位置不正确,android,gps,Android,Gps,我正在调查三星Galaxy2(Android 2.3.5)上的GPS定位。SG2支持A-GPS,所以我打开了GPS、Wifi网络和传感器辅助。它看起来工作得很好,但有时GPS给出的位置与我现在的位置完全不同,相距超过50公里。而且位置经常变化,即使我只在电话上放了一个点,从来没有碰过 我对Android还是新手,所以我不确定是什么导致了这个问题。下面是处理GPS位置的源代码: public class LocationMonitor extends Service implements Loca
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;
}
}
}
公共类LocationMonitor扩展服务实现LocationListener,Runnable{
……这里还有其他局部变量
对象位置UpdateNotifier=null;
公共静态地质点位置;
公共void同步()
{
if(ourLocation==null)
{
ourLocation=getLastKnownLocation();
if(ourLocation==null)返回;
}
//上次同步时加载
long lastSyncTime=某个_值;
if(lastSyncTime