融合位置提供程序 - 通过位移更新位置不起作用

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_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。此方法适用于后台用例,更具体地说,适用于接收位置更新,即使应用程序已被系统终止。

【讨论】:

以上是关于融合位置提供程序 - 通过位移更新位置不起作用的主要内容,如果未能解决你的问题,请参考以下文章

融合位置问题 - 地理位置不起作用

Oreo+ 中位置更新的前台服务不起作用

当应用程序处于后台并且网络连接丢失时,位置更新计时器不起作用?

当应用程序移到后台时,在前台服务中获取位置更新不起作用

当前位置更新在 iphone 设备中不起作用

当我在谷歌设置android中关闭和打开位置时,FusedLocation 不起作用