基本上,该requestLocationUpdate()
方法将您的活动注册为位置更新的接收者,并且onLocationChanged()
每次通过位置提供程序提供位置更新时,Android 都会触发该方法。所以你要做的很简单,注册你的活动以获取位置更新:
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
String locationProvider = LocationManager.NETWORK_PROVIDER;
Location mLocation;
onLocationChanged(locationManager.getLastKnownLocation(locationProvider));
locationManager.requestLocationUpdates(locationProvider, 60 * 1000, 25, this);
然后在以下位置处理位置更新onLocationChanged()
:
@Override
public void onLocationChanged(Location location) {
if (LocationUtil.isBetterLocation(location, mLocation)) {
mLocation = location;
// do something
}
}
这是一个有用的代码片段,用于确定位置更新是否有用(在 Inet 中的某处找到):
/* acceptable time delta between location updates */
private static final int TIME_FRAME = 1000 * 60 * 2;
/**
* Determines whether one location reading is better than the current location.
*
* @param location
* The new Location that you want to evaluate
* @param currentBestLocation
* The current Location fix, to which you want to compare the new one
*
* @return indicates if you should use the new location
*/
public static boolean isBetterLocation(Location location, Location currentBestLocation) {
if (currentBestLocation == null) {
// A new location is always better than no location
return true;
}
// Check whether the new location fix is newer or older
long timeDelta = location.getTime() - currentBestLocation.getTime();
boolean isSignificantlyNewer = timeDelta > TIME_FRAME;
boolean isSignificantlyOlder = timeDelta < - TIME_FRAME;
boolean isNewer = timeDelta > 0;
// If it's been more than two minutes since the current location, use the new location
// because the user has likely moved
if (isSignificantlyNewer) {
return true;
// If the new location is more than two minutes older, it must be worse
} else if (isSignificantlyOlder) {
return false;
}
// Check whether the new location fix is more or less accurate
int accuracyDelta = (int) (location.getAccuracy() - currentBestLocation.getAccuracy());
boolean isLessAccurate = accuracyDelta > 0;
boolean isMoreAccurate = accuracyDelta < 0;
boolean isSignificantlyLessAccurate = accuracyDelta > 200;
// Check if the old and new location are from the same locationProvider
boolean isFromSameProvider = isSameProvider(location.getProvider(), currentBestLocation.getProvider());
// Determine location quality using a combination of timeliness and accuracy
if (isMoreAccurate) {
return true;
} else if (isNewer && !isLessAccurate) {
return true;
} else if (isNewer && !isSignificantlyLessAccurate && isFromSameProvider) {
return true;
}
return false;
}
/**
* Validates if the provider are equal.
*
* @param provider1 - provider
* @param provider2 - provider
*
* @return <code>TRUE</code> if the provider are the same
*/
public static boolean isSameProvider(String provider1, String provider2) {
if (provider1 == null) {
return provider2 == null;
}
return provider1.equals(provider2);
}