融合位置提供程序 - 通过位移更新位置不起作用
Posted
技术标签:
【中文标题】融合位置提供程序 - 通过位移更新位置不起作用【英文标题】: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
方法的吗?
【参考方案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_DISTANCE
和 LOCATION_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。此方法适用于后台用例,更具体地说,适用于接收位置更新,即使应用程序已被系统终止。
【讨论】:
以上是关于融合位置提供程序 - 通过位移更新位置不起作用的主要内容,如果未能解决你的问题,请参考以下文章