代码之家  ›  专栏  ›  技术社区  ›  Simon

在android上运行非常慢的地理定位

  •  3
  • Simon  · 技术社区  · 6 年前

    我正在使用离子/角度/火烧基础构建一个应用程序。

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

    • 在PC上,获取当前 地理位置。

    • 在ios上大约需要1秒。

    • 在android上,它需要6+秒,有时甚至完全失败。

    这是离子原生的问题吗?安卓有没有特别的插件?

    这是我的代码:

    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上,有什么需要我做的吗?我可以用别的插件吗?任何帮助都将是惊人的!

    3 回复  |  直到 6 年前
        1
  •  3
  •   Devin Carpenter Assaf Hershko    6 年前

    你正在使用的代码正在工作。

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

    通过快速搜索,ios似乎没有高精度的模式,因为默认情况下ios使用gps、wifi、蓝牙等来获取你的位置……你不能像android那样打开或关闭它,这就解释了为什么ios总是那么快知道你在哪里。所以在android设备上,你需要提示用户打开它,插件由@maheshvirus提到。除非用户将其模式更改为省电模式或仅设备定位模式,否则它将始终保持打开状态。

    个人电脑应该有更快的互联网,不应该有数据上限或严格的限制(除非网络中立性现在已经完全消失或你在其他可怕的地方),所以你的浏览器应该能够通过你连接的调制解调器/路由器很容易和快速地找到你-请看 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插件请求定位精度 '

        2
  •  1
  •   Maheshvirus    6 年前

    代码没有问题。我在安卓手机上也面临同样的问题。 我试过的解决办法。

    手动解决方案

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

    • 检查google map是否正在获取您的当前位置。尝试在谷歌地图上获取你当前的位置。无论如何,如果谷歌地图找不到你的当前位置,那么你就无法进入你的应用程序。

    一旦你在谷歌地图上找到了当前的位置,你可能会将该位置输入到你的应用程序中。

    使用插件的解决方案

    <plugin name="cordova-plugin-request-location-accuracy" spec="*" /> 
    
        3
  •  0
  •   fitzmode    6 年前

    我也遇到过类似的情况 Geolocation 是的。在 Platform 准备好了。虽然这是你期望调用它的方式,但是忽略它会导致在你从插件得到响应之前出现明显的延迟,在android中更是如此。

    import { Platform } from 'ionic-angular'
    ...
    
    constructor( private platform: Platform) { 
    this.platform.ready().then(() => {
      //request location here
     })
    }
    ...