LocationManager locationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
//定义一个监听器来响应位置的更新
LocationListener locationListener = new LocationListener()
{
public void onLocationChanged(Location location)
{
useNewLocation(location);
}
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
public void onProviderEnabled(String provider)
{
}
public void onProviderDisabled(String provider)
{
}
};
//注册监听器接收位置信息
LocationProvider locationProvider = LocationManager.NETWORK_PROVIDER;
//LocationProvider locationProvider=LocationManager.GPS_PROVIDER;
locationManager.requestLocationUpdates(locationProvider, 0, 0, locationListener);
//停止监听
locationManager.removeUpdates(locationListener);
//利用缓存的位置信息
Location lastKnowLocation = locationManager.getLastKnowLocation(locationProvider);
//维护一个最佳估测量的完整逻辑
private static final int TWO_MINUTES = 1000 * 60 * 2;
protected boolean isBetterLocation(Location location, Location currentBestLocation)
{
if(currentBestLocation == null)
{
return true;
}
long timeDelta = location.getTime() - currentBestLocation.getTime();
boolean isSignificantlyNewer = timeDelta > TWO_MINUTES;
boolean isSignificantlyOlder = timeDelta < -TWO_MINUTES;
boolean isNewer = timeDelta > 0;
if(isSignificantlyNewer)
{
return true;
}
else if(isSignificantlyOlder)
{
return false;
}
int accuracyDelta = (int)(location.getAccuracy() - currentBestLocation.getAccuracy());
boolean isLessAccurate = accuracyDelta > 0;
boolean isMoreAccurate = accuracyDelta < 0;
boolean isSignificantlyLessAccurate = accuracyDelta > 200;
boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider());
if(isMoreAccurate)
{
return true;
}
else if(isNewer && !isLessAccurate)
{
return true;
}
else if(isNewer && !isSignificantlyLessAccurate && isFromSameProvider)
{
return true;
}
return false;
}
private boolean isSameProvider(String provider1, String provider2)
{
if(provider1 == null)
{
return provider == null;
}
return provider1.equals(provider2);
}
//选择合适的位置服务提供者
Criteria criteria = new Criteria();
//经度要求
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(false);
criteria.setPowerRequirement(Criteria.POWER_LOW);
//取得效果最好的criteria
String provider = mlocationManager.getBestProvider(criteria, true);