地理位置在Android上运行非常慢

时间:2018-07-01 00:56:26

标签: javascript cordova ionic-framework ionic2 cordova-plugins

我正在使用Ionic / Angular / Firebase构建应用程序。

该应用程序需要用户的地理位置。我正在使用Ionic native的地理位置插件,并且在Android速度方面遇到了一些问题。

  • 在PC上花费不到500毫秒即可获得电流 地理位置。

  • 在iOS上大约需要1秒钟。

  • 在Android上需要6秒钟以上的时间,有时甚至会完全失败。

这是Ionic Native的问题吗?有专门针对Android的插件吗?

这是我的代码:

ga('set', 'anonymizeIp', true);

我无法想象这段代码是错误的。。正如我所说,它在PC和iOS上都可以很好地工作。如果用户使用的是android,我应该做些什么吗?我可以使用其他插件吗?任何帮助都将是惊人的!

3 个答案:

答案 0 :(得分:3)

您正在使用的代码有效。

@Maheshvirus所说的是'cordova-plugin-request-location-accuracy'插件,它实际上允许您提示用户打开GPS的高精度位置信息(并检查并确认它是否首先打开),该信息将“使用GPS,WiFi,蓝牙或蜂窝网络确定位置”。我在我的应用程序中使用了相同的插件,效果很好。

通过快速谷歌搜索,似乎IOS没有高精度模式,因为默认情况下,IOS使用gps,wifi,蓝牙等来获取您的位置...您无法像Android一样将其打开和关闭,这说明为什么IOS总是如此迅速地知道您的位置。因此,在Android设备上,您需要使用@Maheshvirus提到的插件来提示用户将其打开。除非用户将其模式更改为省电模式或仅设备定位模式,否则它应该始终保持打开状态。

PC应该具有更快的互联网连接速度,并且不应该有数据上限或严重的节流(除非网络中立性现在已经完全消失或您处于其他可怕的地方),因此您的浏览器应该能够轻松,快速地找到您通过您所连接的调制解调器/路由器-有关更多详细信息,请参见this post answer

解决方案

我现在太累了,无法为您提供所需的工作代码示例,但利用Geolocation.watchPosition()而不是getCurrentPosition()可以让您更快地获取位置使用它的经验-和this user seems to have tested it。 watchPosition“用于注册一个处理程序函数,该函数将在每次设备位置更改时自动调用”。 watchPosition函数的用法几乎与getCurrentPosition完全相同,除了调用它时,您必须为其分配一个ID并在完成后使用Geolocation.clearwatch(idname)。 Here is the docs for watchPosition()。因此,很酷的事情是,如果用户移动了,或者电话定位服务认为他们已经移动了,则不必启动对设备GPS的另一个呼叫(这花费了很长时间),因为GPS已经听。

对不起,我没有提供实际的代码修复,但希望这些详细信息对您有所帮助。当我在不同设备上使用getCurrentPosition时,我也遇到了这个问题。 实现watchPosition()应该没有问题,并且应该立即看到android位置延迟的改善-特别是如果您让用户使用该插件打开“高精度位置”模式'cordova-plugin-request-location-accuracy'< / p>

答案 1 :(得分:1)

代码没有错。我在Android手机中也面临同样的问题。 我尝试过的解决方案。

手动解决方案

  • 进入位置设置选项。检查位置模式是否设置为仅设备。将其设置为高精度,然后尝试
  • 关闭然后再打开您的位置设置选项,进入设置->位置选项。重新启动手机,然后尝试

  • 检查Google地图是否正在获取您的当前位置。尝试在Google地图上获取您当前的位置。无论如何,如果google map找不到您的当前位置,那么您将无法在应用中访问位置。

一旦您在Google地图上找到了当前位置,您就有可能将该位置输入到您的应用中。

使用插件的解决方案

<plugin name="cordova-plugin-request-location-accuracy" spec="*" /> 

答案 2 :(得分:0)

我与Geolocation的情况相似。至关重要的是,只有在Platform准备好后才能调用本机方法。虽然您应该这样调用它,但忽略它会导致从插件获得响应之前的大量延迟,在Android中更是如此。

import { Platform } from 'ionic-angular'
...

constructor( private platform: Platform) { 
this.platform.ready().then(() => {
  //request location here
 })
}
...
相关问题