【问题标题】:Geolocation running very slow on Android地理位置在 Android 上运行非常缓慢
【发布时间】:2018-12-09 16:56:37
【问题描述】:

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

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

  • 在 PC 上,获取电流的时间不到 500 毫秒 地理位置。

  • 在 iOS 上大约需要 1 秒。

  • 在 Android 上需要 6 多秒,有时甚至完全失败。

这是 Ionic Native 的问题吗?有专门的安卓插件吗?

这是我的代码:

this.geolocation.getCurrentPosition({enableHighAccuracy: false, timeout: 3000, maximumAge: 100000}).then((resp) => {
   this.userLocation.lat = resp.coords.latitude;
   this.userLocation.lng = resp.coords.longitude;
   this.getLocation();
}).catch((error) => {
  this.geolocation.getCurrentPosition({enableHighAccuracy: true, timeout: 3000, maximumAge: 100000}).then((resp) => {
     this.userLocation.lat = resp.coords.latitude;
     this.userLocation.lng = resp.coords.longitude;
     this.getLocation();
  }).catch((error) => {
    this.userLocation.lat = this.userData.location.lat || 0;
    this.userLocation.lng = this.userData.location.lng || 0;
    //if fails, get users last known location.
    this.getLocation();
    console.log('Error getting location', error);
  });
  console.log('Error getting location', error);
});

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

【问题讨论】:

  • 哪个android版本失败了?
  • @SurajRao 我正在使用默认 android 操作系统的三星 s8 上进行测试。
  • 您是要获取坐标还是地址?
  • @MayankRaj 只是坐标
  • 我们在最近的编程冒险中发现了一个非代码原因。一位用户经常摔倒她的手机,导致她的 SD 卡连接不良。因此,定位服务会静默失败或耗时过长。

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


【解决方案1】:

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

手动解决方案

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

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

在谷歌地图上找到当前位置后,您可能会将该位置输入到您的应用中。

使用插件的解决方案

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

【讨论】:

  • 您好,感谢您的评论。关于手动方法,谷歌地图会立即加载我当前的位置,当我在 6 秒后打开我的应用程序时,它会超时并且找不到我的位置。关于插件,它应该做什么?它是我应该安装的插件吗?
  • 请检查您是否已授予对已安装应用的位置访问权限。如果您选择拒绝访问位置,则应用将不会获取您的位置。从 sdk 版本 23 及更高版本开始,它会在您第一次尝试获取位置时询问您是否允许位置访问。那时您必须选择允许位置。如果您的 android sdk 版本小于 22,它不会要求您这样做。它会自动获取位置访问权限。
  • 关于 cordova-plugin-request-location-accuracy 插件,当您的 gps 未启用或由于某些原因无法获取时,它每次都会询问您是否允许 gps 访问弹出窗口。它将解决您的问题.in naugat 这个权限问题导致更多。
  • 首先获取谷歌当前位置。如果你找到它然后..有时它需要重新启动你的手机。仍然无法重新安装你的应用程序
【解决方案2】:

您正在使用的代码正在运行。

@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'

【讨论】:

  • 这正是我想要的。谢谢!我给了你赏金:)
  • @Jane Doe 很高兴我能帮上忙!
  • watchPosition 仅在应用程序处于前台时触发,在我的情况下不知道一定有什么问题..
  • 据我了解,这个插件只用于前台,后台还有另外一个 cordova-plugin-mauron85-background-geolocation
  • @Naga 我不确定哪个插件最适合用于在后台查看位置。该插件可能很有希望,但我从未使用过它,它昨天刚刚发布。 watchPosition() 是一个用于 Web 应用程序的 Web API,不会在后台运行,因为您似乎 and others have found.
【解决方案3】:

Geolocation 也有类似的情况。仅在 Platform 准备好之后才调用本机方法至关重要。虽然这是您期望的调用方式,但忽略它会导致您在收到插件响应之前出现明显延迟,在 Android 中更是如此。

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

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

【讨论】:

    【解决方案4】:

    我只是在选项中删除maximumAge。我的最终选择:

     { enableHighAccuracy: true, timeout: 10000 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      相关资源
      最近更新 更多