onLocationChanged和requestLocationUpdates如何链接在一起

时间:2013-11-10 15:57:40

标签: android geolocation location

我想创建一个跟踪应用程序。用户可以选择一个点作为目标点。一旦用户点击开始按钮,应用程序将确定用户当前位置,并将在用户刚刚选择的目的地结束。

我在使用户移动时使当前位置标记移动时遇到问题。我的意思是,一旦用户开始移动,我希望标记在地图上移动。这意味着应用程序将检测用户位置,直到他们到达目的地。

到目前为止,我看到了几个代码示例,其中大多数使用requestLocationUpdateonLocationChange来检测用户是否移动。我不知道这两个函数如何链接在一起,因为它们似乎没有相互连接。就我所关注的而言,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();
    }
}

那么,代码实际上是如何工作的?真的需要帮助。提前谢谢。

1 个答案:

答案 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);
}