0

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

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

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

那么,代码实际上是如何工作的呢?这里真的需要帮助。先感谢您。

4

1 回答 1

0

基本上,该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);
}
于 2013-11-10T16:11:23.820 回答