1

情况:我的程序有很多部分是基于位置的,但是为了在实际需要位置时加速问题,我没有时间锁定。我设计的解决方案是在主要操作期间获取位置信息(阅读:主屏幕),以便在特定部件需要它们时可以使用该位置。

现在我注册更新并在 onLocationChanged 中检查位置是否足够准确。如果是,它会调用 removesUpdates。

问题:如果设备处于无法获得准确位置(或任何位置)的位置,则 GPS 不会关闭,电池会过热,用户会非常沮丧。

问题:有没有一种干净的方法来检查 GPS 是否未能获得锁定,并告诉它在某个时间点放弃?我创建了一个线程计时器,但由于请求与 onPause/onResume 相关联,我不想创建可能会纠缠在一起的额外线程。

4

4 回答 4

2

使用服务来封装此功能。从里面运行一个异步任务。

您可以在必要时使用绑定来处理与活动的交互

于 2011-10-26T23:36:49.823 回答
1

有没有一种干净的方法来检查 GPS 是否无法锁定

是的,在某些情况下 GPS 长时间无法修复。根据我的经验,这些是:

  • 没有辅助数据。你看,手机中的 GPS 芯片组有几个限制条件(电池、速度等),因此它们在锁定修复方面很慢。GPS 芯片组必须扫描卫星频谱,这需要一段时间。援助信息通过互联网发送。这包含具有卫星位置和频率信息的年历数据,因此这缩短了 GPS 信号搜索时间。没有互联网意味着 GPS 芯片组需要 2 分钟以上才能得到修复(这称为独立 GPS)。这个时间因芯片组、地形、天气等而异。

    tldr:检查互联网是否可以访问,如果不是,你应该期待很长的TTFF(第一次修复的时间)

  • 卫星能见度低:这发生在室内情况下。即使 GPS 芯片组有辅助数据。它无法看到卫星,因为它在室内。这意味着卫星信噪比低,或者可见卫星数<4。理论上2颗卫星就足够了。但在实践中,我已经看到至少需要 4 颗卫星才能正确修复。

    tldr:使用 NMEA 监听器/ GPS 状态监听器查看有多少卫星可见/使用。必须使用至少 4 颗卫星进行修复)

  • 硬件/软件问题:您对此无能为力。一些 GPS 芯片组允许您发送额外信息以“重置”GPS 缓存数据。留意巨大的 TTFF 时间和其他此类异常 GPS 模式,使用超时机制。

这主要是从 GPS 的角度编写的,所以如果这没有多大意义,请不要介意。

于 2011-10-27T02:43:48.747 回答
1

除了梅林的回答(当它出现时,我只是在记事本中输入了这个很多) - 我同意。我的建议是:

面对类似的问题,我决定最好的办法是通过服务将整个 GPS 与主要活动分离。

我的意思是有一个服务,它执行requestsLocationUpdates()andremoveLocationUpdates()并实现LocationListener. 该服务提供了主要活动可以通过IBinder接口调用的方法。它还向实现 a 的 Activity 发送广播以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

于 2011-10-26T23:50:37.393 回答
0

我有一个类似的问题。我希望能够在我的所有活动中获取 GPS 坐标,但不想实现带有 GPS 侦听器的超类,有时如果意图调用相同的活动,我会遇到 GPS 卡住的一些问题。不想在 onPause 期间禁用它..

基本上我创建了一个获取 GPS 更新的服务,然后我计算有多少听众连接/断开连接到我的服务。如果回调 = 0,那么我停止 GPS。如果回调 = 1 我启动它。

这似乎工作得很好,并且似乎是一个非常简单的方法来处理整个应用程序中的 GPS 更新。好消息是,当我在 onStop 中取消注册回调时,我的 onStart 实际上会在从上一个活动调用 onStop 之前先连接。这意味着我的 GPS 不会错过任何一个节拍。

我实现了一个超类,它连接并实现了我的服务的回调(通过aidl)。这样,每个活动类都可以访问信息,就好像它是在活动中实现的一样。

于 2011-10-27T02:51:17.937 回答