当前位置: 首页 > 知识库问答 >
问题:

融合的位置提供程序setsmallstDisplace在Android中不起作用

鞠安民
2023-03-14

嗨,我已经实现了融合位置提供程序Api,用于在服务中获取位置更新。我能够根据设置的间隔触发onlocationchange事件。但是,当我将setsmallstDisplace设置为10米时,即使设备静止,事件也会被触发。是否有人有类似的问题。请提供建议。下面是代码

    mlocationrequest = LocationRequest.create();
    mlocationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mlocationrequest.setInterval(60000); // Update location every 1 minute
    mlocationrequest.setFastestInterval(10000);
    mlocationrequest.setSmallestDisplacement(10);


    LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleApiClient, mlocationrequest, this);

为了找到两个位置值之间的距离,我使用了这种方法。

public static float distFrom (float lat1, float lng1, float lat2, float lng2 ) 
{
    double earthRadius = 3958.75;
    double dLat = Math.toRadians(lat2-lat1);
    double dLng = Math.toRadians(lng2-lng1);
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
    Math.sin(dLng/2) * Math.sin(dLng/2);
    double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
    double dist = earthRadius * c;

    int meterConversion = 1609;

    return new Float(dist * meterConversion).floatValue();
}

但是即使设备是静止的,我也能得到43.51 , 49.32 , 520.02的距离。是因为平板电脑在室内使用吗?

共有2个答案

段志
2023-03-14

可能发生的情况是,您在描述超过10个位移的onLocationChanged方法中得到的lat long不同。因此,请检查您获得的lat long,并手动测量距离一次,以交叉验证。

除此之外,还有一个可能的原因是优先级问题,如果上述情况看起来不错,请尝试如下:

 mlocationrequest = LocationRequest.create();
mlocationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
mlocationrequest.setSmallestDisplacement(10);
mlocationrequest.setInterval(60000); // Update location every 1 minute
mlocationrequest.setFastestInterval(10000);
单于奇略
2023-03-14

如果位移设置为LocationRequest,则如果设备仍处于静止状态,则无法获取位置,因为位移优先于间隔(间隔和快速间隔)。正如我所猜测的,可能是您向LocationServices传递了不同的LocationRequest对象(没有位移设置)。FusedLocationApi。requestLocationUpdates()。

我一直在寻找一个答案,如果间隔和位移都设置好,LOC是如何接收的。我刚刚用我的应用程序对自己进行了验证,下面是LocationRequest不同配置的行为:

>

我每隔一分钟就收到一次位置。但是你看它有时收得很快,有时收得很慢,这是因为setInterval不精确。

06-03 11:46:55.408 25776-25776/MyLocationListener︰onLocationChanged。
06-03 11:47:56.008 25776-25776 /MyLocationListener︰onLocationChanged。
06-03 11:48:18.768 25776-25776 /MyLocationListener︰onLocationChanged。
06-03 11:49:22.938 25776-25776 /MyLocationListener︰onLocationChanged。
06-03 11:50:22.948 25776-25776 /MyLocationListener︰onLocationChanged。
06-03 11:52:22.978 25776-25776 /MyLocationListener︰onLocationChanged。
06-03 11:53:22.998 25776-25776 /MyLocationListener︰onLocationChanged。

位移参数设置为10米
setInterval,如超过1分钟。

如果设备未移动或跨越该距离,则不会收到位置更新。在每一次换位之间,我都走了10多米,所以我收到了loc。

06-03 11:26:53.328 16709-16709/MyLocationListener﹕ OnLocation已更改
06-03 11:35:38.318 16709-16709/MyLocationListener﹕ OnLocation已更改
06-03 11:39:16.728 16709-16709/MyLocationListener﹕ OnLocation已更改。

 类似资料:
  • 我在MainActivity类中有一个提供纬度和经度值的融合位置提供程序代码,它使用persistableBundle传递给JobService类。当用户使用应用程序时,它工作正常(即应用程序位于前台)。一旦应用程序被刷出或销毁,MainActivity的最后更新值就会一直通过作业调度器重复上传(即,作业调度器始终获得相同的值,融合的位置提供程序不工作)。即使应用程序不在前台,我应该怎么做才能使其

  • 我正在检查移动设备上是否启用了位置服务,如果是,请监听构建GoogleAppClient并监听位置更改。我面临的问题是,一旦在mobile中打开位置并重新启用,我就无法获得位置(纬度/长)。位置始终为空。 isLocationEnabled检查位置是否已打开

  • 这就是我如何注册我的应用程序来接收位置更新: 我悬而未决的意图几乎在所要求的时间间隔内被后台调用... 到目前为止还好。 问题:当WIFI被禁用/没有连接到任何网络,或者当没有3G/4G网络数据启用-融合位置提供商没有提供新的位置更新!! 我的位置访问设置打开,并检查GPS卫星和WI-FI和移动网络位置。 更大的问题是:有时在这种情况下,我确实通过挂起的意图接收位置更新回调,但它知道最后的位置(即

  • 我想通过Android LocationManager API使用fused location provider,因为: 我不想让应用程序Phonelocator依赖于google play服务 现有的实现已经在工作和测试 看起来这是可能的。只需将字符串“融合”作为安装了google play服务的手机上的位置提供程序传递即可。 我想选择使用优先级高精度配置文件。我怀疑,默认情况下,它没有被使用。

  • 我一直在尝试获取我当前的位置更新,并按照Google的建议使用了融合位置提供商,但我无法获得任何更新。我在网上彻底搜索了,但找不到任何解决方案。融合提供商返回的位置甚至不接近我所在的位置,它显示了其他一些国家。有人能在这里帮我吗?

  • 我一直在尝试使用andriod中的融合位置应用程序接口获取位置(lat/lon)。当wifi和gps都打开时,我的代码运行良好。如果我关闭gps,那么我不会得到任何位置更新。 我正在使用BALANCED_POWER_ACCURACY进行位置请求。我在清单中添加了Access_FINE_Location权限,并在我的build.gradle文件中使用了播放服务版本9.2.1。 我正在真实设备上进行测