情况:我的程序的部件基于位置很大,但是为了加快实际需要位置的问题,我没有时间锁定。我设计的解决方案是在主要操作期间获取位置信息(读取:主屏幕),以便在特定部件需要时可以使用该位置。
现在我注册更新,并在onLocationChanged中检查位置是否足够准确。如果是,则调用removedUpdates。
问题:如果设备位于无法获得准确位置(或任何位置)的地方,GPS无法关闭,击球手过热,用户会非常沮丧。
问题:是否有一个很好的干净方法来检查GPS是否未能锁定,并告诉它在某一点放弃?我创建了一个线程计时器,但因为请求与onPause / onResume绑定,所以我不想创建额外的线程,这些线程可能会全部纠结。
答案 0 :(得分:2)
使用服务封装此功能。从内部运行asynchtask。
您可以使用绑定来处理必要时与活动的交互
答案 1 :(得分:1)
继Merlin的答案之后(我刚刚在记事本中输入这个产品) - 我同意。我的建议是:
面对类似的问题,我认为最好的做法是通过服务将整个GPS与主要活动分离。
我的意思是有一项服务可以执行requestsLocationUpdates()
和removeLocationUpdates()
并实现LocationListener
。此服务提供主要活动可以通过IBinder
接口调用的方法。它还向活动发送广播,该活动实现BroadcastReceiver
以收听这些消息。
因此,您的主要活动可以调用的服务方法之一是(比如说)
mLocnServ.startGPS(int timeout, float requiredAccuracy, int minUpdatePeriod, int minResendDistance)
其中mLocnServ
是服务公开的活页夹界面。
最后两个参数是作为参数传递给服务中的requestLocationUpdates的参数。 (我个人认为,当GPS关闭时,这些都没有任何区别,据我所知,它一直运行直到removeUpdates()
被调用)。无论如何,第一个参数(超时)应该是您准备等待修复所需精度的时间(参数2)。
因此,在您的服务中,您需要一个Runnable作为计时器,如果超时,将发送类型为TIMED_OUT
的广播(比如说)和removeUpdates以停止GPS。在你的onLocationChanged你可以测试你得到的位置与所需的准确度,如果足够好,发送类型为GOT_A_FIX
的广播(比如说)并将该位置(纬度/经度和准确度)作为广播中的额外内容传递,然后removeUpdates停止GPS。 (TIMED_OUT
和GOT_A_FIX
只是枚举的示例名称,您可以用来区分广播消息类型)
主要活动可以决定在其BroadcastReceiver onReceive()中做什么,即如果它有TIMED_OUT
广播或者如何处理从GOT_A_FIX
获得的数据,是否再试一次消息。
您可能还需要在活页夹中使用mLocnServ.stopGPS
,这样无论服务在做什么,您都可以关闭GPS
答案 2 :(得分:1)
是否有一个很好的干净方法来检查GPS是否无法获得锁定
是的,有些情况下GPS很长时间无法修复。根据我的经验,这些是:
没有辅助数据。你看,手机中的GPS芯片组有几个限制因素(电池,速度等),因此它们在锁定到修复时很慢。 GPS芯片组必须扫描卫星频谱,这需要一段时间。援助信息通过互联网发送。这包含具有卫星位置和频率信息的年历数据,因此缩短了GPS信号搜索时间。没有互联网意味着GPS芯片组需要2分钟以上才能获得修复(这称为独立GPS)。这个时间因芯片组,地形,天气等而异。
(tldr
:检查互联网是否可以访问,如果不是,您应该期待长TTFF(首次修复的时间)
低卫星可见度:这种情况发生在室内机箱中。即使GPS芯片组有辅助数据。它看不到卫星,因为它是室内的。这意味着卫星信噪比低,或者可见卫星的数量<1。理论上2颗卫星就足够了。但实际上我已经看到至少需要4颗卫星才能正确修复。
(tldr
:使用NMEA监听器/ GPS status listener查看有多少卫星可见/使用。必须使用Atleast 4卫星进行修复
硬件/软件问题:您无法对此做很多事情。某些GPS芯片组允许您发送额外信息以“重置”GPS缓存数据。注意巨大的TTFF时间和其他这样的异常GPS模式,使用超时机制。
这主要是从GPS的角度编写的,所以如果这没有多大意义,请不要介意。
答案 3 :(得分:0)
我有类似的问题。我希望能够在我的所有活动中获得GPS坐标,但是不想实现具有GPS监听器的超类,有时如果意图称为相同的活动,我遇到了一些GPS问题。不想在onPause期间禁用它..
基本上我创建了一个获取GPS更新的服务,然后我计算有多少听众连接/断开了我的服务。如果回调= 0,那么我停止GPS。如果callbacks = 1我启动它。
这看起来效果很好,并且似乎是在整个应用程序中处理GPS更新的一种非常简单的方法。好处是当我在onStop中取消注册我的回调时,我的onStart实际上会在从前一个活动调用onStop之前先连接。这意味着我的GPS不会错过任何一个节拍。
我实现了一个连接&amp;的超类。实现我的服务的回调(通过aidl)。这样,每个活动类都可以访问信息,就像它在Activity中实现一样。