【问题标题】:Fused Location Provider - location updates by displacement not working融合位置提供程序 - 通过位移更新位置不起作用
【发布时间】:2015-12-22 21:45:07
【问题描述】:

我有一个 android 应用程序,它将从后台跟踪位置。我正在使用具有以下配置的融合位置 api

    mLocationRequest = new LocationRequest();
    mLocationRequest.setSmallestDisplacement(100);
    mLocationRequest.setInterval(60*1000);
    mLocationRequest.setFastestInterval(60*1000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

只有在设备移动时我才需要位置更新。有时一切正常。但有时即使设备处于静止状态,我也会收到位置更新。

为什么会出现这个问题?如果我设置位移,我需要设置间隔和最快间隔吗?此问题与 google play 服务版本有关吗?

【问题讨论】:

  • 你能说明你是如何调用requestLocationUpdates方法的吗?

标签: android gps google-play-services fusedlocationproviderapi android-fusedlocation


【解决方案1】:

如果您的手机移动或不考虑您给定的间隔持续时间,它将每 60 秒更新一次您的位置。

【讨论】:

  • 您知道如何仅在设备移动时获取位置吗?
  • 你必须使用这个方法'@Override public void onLocationChanged(Location location) {}'
  • 但是会很敏感。它会在小幅移动时更新位置
  • 我认为我应该通过将时间间隔设置为最大时间来摆脱时间设置。所以如果我搬家,我会得到位置。我只是用这个配置构建。让我们看看会发生什么
  • 我认为增加时间会导致位置更新到特定时间。它没有帮助
【解决方案2】:

使用 GoogleApiClient 请求您的位置更新,例如像这样并使用 Toasts 来验证您的实现:

 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
    float LOCATION_REFRESH_DISTANCE = 5000;
    long LOCATION_REFRESH_TIME = 0;
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LOCATION_REFRESH_TIME, LOCATION_REFRESH_DISTANCE, mlocationListener);
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
    if(mLastLocation!=null){
        Toast.makeText(getApplicationContext(), "YES! mLastLocation!=null", Toast.LENGTH_SHORT).show();
        double latitude = mLastLocation.getLatitude();
        double longitude = mLastLocation.getLongitude();           
        Toast.makeText(getApplicationContext(), "Latitude = " + latitude + "\nLongitude = " + longitude, Toast.LENGTH_SHORT).show();
    }
}

在这里,您可以使用变量 LOCATION_REFRESH_DISTANCELOCATION_REFRESH_TIME(以毫秒为单位)对您的位置请求进行参数化

您当然需要 LocationListener 对象 mLocationListener,您的 GoogleApiClient mGoogleApiClient 需要获取最后一个已知/当前位置和一个 Location 对象(我称之为 mLastLocation)将其存储在哪里。例如:

private Location mLastLocation;
LocationListener mlocationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
    mLastLocation=location;

}

@Override
public void onStatusChanged(String s, int i, Bundle bundle) {

}

@Override
public void onProviderEnabled(String s) {

}

@Override
public void onProviderDisabled(String s) {

}
};

【讨论】:

    【解决方案3】:

    您可能需要的是 FusedLocationProviderApi 的 PendingIntent version。此方法适用于后台用例,更具体地说,适用于接收位置更新,即使应用程序已被系统终止。

    【讨论】:

      猜你喜欢
      • 2014-09-05
      • 2013-08-02
      • 2015-03-02
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 2019-07-28
      • 2017-07-01
      • 2013-09-26
      相关资源
      最近更新 更多