这就是我如何注册我的应用程序来接收位置更新:
mLocationRequest = LocationRequest.create();
mLocationRequest.setInterval(Consts.ONE_MINUTE * 10);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
mLocationRequest.setFastestInterval(Consts.ONE_MINUTE);
Builder builder = new GoogleApiClient.Builder(context);
builder.addApi(ActivityRecognition.API);
mGoogleApiClient = builder.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mGoogleApiClient.connect();
....
....
@Override
public void onConnected(Bundle connectionHint) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, locationUpdatespendingInent);
}
我悬而未决的意图几乎在所要求的时间间隔内被后台调用...
到目前为止还好。
问题:当WIFI被禁用/没有连接到任何网络,或者当没有3G/4G网络数据启用-融合位置提供商没有提供新的位置更新!!
我的位置访问设置打开,并检查GPS卫星和WI-FI和移动网络位置。
更大的问题是:有时在这种情况下,我确实通过挂起的意图接收位置更新回调,但它知道最后的位置(即使是一个小时前,而且我离那个地方很远很远)
根据priority_balanced_power_precess
的文档:
我希望融合定位提供商在没有其他选择的时候打开GPS,或者如果他没有任何选择,至少不会提供新的位置更新。
另一个不可预测和令人不安的问题:
我将priority_balanced_power_creaction
更改为priority_high_creaction
,以便查看它的行为(24小时)。所有的间隔保持不变(更新之间的间隔为10分钟)。即使在没有网络/SIM卡的手机中也能准确定位,但是--电池耗尽得很快!当我查看电池历史时,我惊讶地看到GPS收音机一直处于全传输模式!!!!我还在我的日志中看到,位置每分钟都被接收,甚至我每十分钟请求一次位置(我没有任何其他安装的应用程序打开GPS来接收位置..)
我在几个设备上注意到了这种行为(如Moto X 2013、HTC One X、Nexus 5),所有设备都配有最新的Google Play服务(版本6.1.11)和android KITKAT 4.4.4
我的应用程序在很大程度上依赖于用户的当前位置,并且只要用户登录,就会在指定的间隔内定期接收位置更新,因此我不想使用priority_high_precisity
模式,以防止电池耗尽。
我的问题:
>
如果融合定位提供商设置为通过priority_balanced_power_precision
接收更新,并且没有任何WI-FI或蜂窝塔信息,那么它是否应该使用GPS?
如果是这样,那我做错了什么?
为什么我会得到这个错误的位置更新?(正如我在“更大的问题”一节中解释的那样…
对于指定的问题,
1.如果融合定位提供商设置为通过priority_balanced_power_precision
接收更新,并且没有任何WI-FI或手机信号塔信息,那么它是否应该使用GPS?&
2。如果是这样,那我做错了什么?
显然,文档中的任何地方都没有指定显式唯一的源。使用优先级
选项,即使通过code,获得的位置
的“源”也是“fused”。
[location.getprovider()
返回:“fused”]
我见过只有当LocationRequest具有priority_high_precision时才使用GPS。所以它在其他条件下不使用GPS。
4.当我使用priority_high_precission参数时,为什么GPS无线电一直打开,而不是在10分钟的间隔内打开?(我没有其他安装的应用程序可以更快地触发位置更新..)
最快的间隔已经设置为1分钟。据我所知,当最快间隔的值在持续时间上短于setInterval的值时,setFastestInterval优先于setInterval。
在您的情况下,1分钟对10。
关于没有安装其他触发位置更新的应用程序,它只是作为一个示例给出,并没有明确指定只有这种情况。
这控制html" target="_blank">应用程序接收位置更新的最快速率,在某些情况下(例如,如果其他应用程序正在触发位置更新),该速率可能比setInterval(long)快。
因此,使用priority_high_precisity
,它使用GPS(某种专用),在最快的间隔集-1分钟内请求location
。
3.为什么我会得到错误的位置更新?(正如我在“更大的问题”一节中解释的那样…
还需要检查代码中的pendingintent
机制。尽管有一些事情需要注意:
您可以添加location.gettime()
来确保和验证所获得位置的时间。如果范围内没有wifi-cell塔,并且使用priority_balanced_power_precess
,则很可能没有更新它。
在调用“lastknown”时使用的第一个位置的块级精度是没有帮助的。
电池消耗是因为GPS和1分钟更新的结合。如果适合您的实现,请尝试将最快间隔设置为5或10分钟,但如果需要绝对准确的位置,priority_balanced_power
可能没有帮助。我通常为onlocationchanged
中获得的位置添加一个检查,并根据这个检查在locationRequest中切换优先级。当然,它有助于通常获得位置,除非我在一个没有GPS和WiFi网络的建筑里--没有视线--否则我是在一个没有GPS和WiFi网络的建筑里。
我在MainActivity类中有一个提供纬度和经度值的融合位置提供程序代码,它使用persistableBundle传递给JobService类。当用户使用应用程序时,它工作正常(即应用程序位于前台)。一旦应用程序被刷出或销毁,MainActivity的最后更新值就会一直通过作业调度器重复上传(即,作业调度器始终获得相同的值,融合的位置提供程序不工作)。即使应用程序不在前台,我应该怎么做才能使其
我正在检查移动设备上是否启用了位置服务,如果是,请监听构建GoogleAppClient并监听位置更改。我面临的问题是,一旦在mobile中打开位置并重新启用,我就无法获得位置(纬度/长)。位置始终为空。 isLocationEnabled检查位置是否已打开
我想通过Android LocationManager API使用fused location provider,因为: 我不想让应用程序Phonelocator依赖于google play服务 现有的实现已经在工作和测试 看起来这是可能的。只需将字符串“融合”作为安装了google play服务的手机上的位置提供程序传递即可。 我想选择使用优先级高精度配置文件。我怀疑,默认情况下,它没有被使用。
我一直在尝试获取我当前的位置更新,并按照Google的建议使用了融合位置提供商,但我无法获得任何更新。我在网上彻底搜索了,但找不到任何解决方案。融合提供商返回的位置甚至不接近我所在的位置,它显示了其他一些国家。有人能在这里帮我吗?
嗨,我已经实现了融合位置提供程序Api,用于在服务中获取位置更新。我能够根据设置的间隔触发onlocationchange事件。但是,当我将setsmallstDisplace设置为10米时,即使设备静止,事件也会被触发。是否有人有类似的问题。请提供建议。下面是代码 为了找到两个位置值之间的距离,我使用了这种方法。 但是即使设备是静止的,我也能得到43.51 , 49.32 , 520.02的距离
我正在构建一个应用程序,其中我使用的是来自此教程链接的融合提供程序代码,但当我想运行我的应用程序时,我收到以下错误: com.android.build.api.transform.transformException:com.android.ide.common.Process.processException:org.gradle.Process.internal.execexception: