我想创建一个跟踪应用程序。用户可以选择一个点作为目标点。一旦用户点击开始按钮,应用程序将确定用户当前位置,并将在用户刚刚选择的目的地结束。
我在使用户移动时使当前位置标记移动时遇到问题。我的意思是,一旦用户开始移动,我希望标记在地图上移动。这意味着应用程序将检测用户位置,直到他们到达目的地。
到目前为止,我看到了几个代码示例,其中大多数使用requestLocationUpdate
和onLocationChange
来检测用户是否移动。我不知道这两个函数如何链接在一起,因为它们似乎没有相互连接。就我所关注的而言,onLocationChange
是告诉应用程序用户的位置是否正在发生变化。
这是我在Google Developer页面上看到的示例代码。
public void onLocationChanged(Location location) {
mConnectionStatus.setText(R.string.location_updated);
mLatLng.setText(LocationUtils.getLatLng(this, location));
}
private void startPeriodicUpdates() {
mLocationClient.requestLocationUpdates(mLocationRequest, this);
mConnectionState.setText(R.string.location_requested);
}
这就是它的调用方式。 startUpdate()是一个按钮的android:onClick。
public void startUpdates(View v) {
mUpdatesRequested = true;
if (servicesConnected()) {
startPeriodicUpdates();
}
}
那么,代码实际上是如何工作的?真的需要帮助。提前谢谢。
答案 0 :(得分:0)
基本上,requestLocationUpdate()
方法会将您的活动注册为位置更新的接收方,并且每次通过位置提供商提供位置更新时,Android都会触发onLocationChanged()
方法。因此,您需要做的非常简单,请注册您的活动以进行位置更新:
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
}
}
这是一个有用的代码snipet,用于确定位置更新是否有用(在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);
}