【问题标题】:android geolocation using phonegap code: 3 error使用phonegap代码的android地理定位:3错误
【发布时间】:2013-11-27 10:27:05
【问题描述】:

我正在尝试使用 PhoneGap API 文档使用地理位置,但收到以下错误消息,

警报 代码:3 消息:超时已过期

我的代码是,

    <script>

// Wait for Cordova to load
//
document.addEventListener("deviceready", onDeviceReady, false);

var watchID = null;

// Cordova is ready
//
function onDeviceReady() {
    // Throw an error if no update is received every 30 seconds
    var options = { timeout: 10000 };
    watchID = navigator.geolocation.watchPosition(onSuccess, onError, options);
}

// onSuccess Geolocation
//
function onSuccess(position) {
    var element = document.getElementById('geolocation');
    element.innerHTML = 'Latitude: ' + position.coords.latitude + '<br />' +
                    'Longitude: ' + position.coords.longitude + '<br />' +
                    '<hr />' + element.innerHTML;
}

// onError Callback receives a PositionError object
//
function onError(error) {
    alert('code: ' + error.code + '\n' +
      'message: ' + error.message + '\n');
}

请告诉我我缺少什么。

【问题讨论】:

    标签: android cordova


    【解决方案1】:

    我通过不指定 maximumAge 和 timeout 为运行最新 Android(物理设备)的 HTC M8 解决了这个问题。

    navigator.geolocation.getCurrentPosition(onSuccess, onError, {
      // maximumAge: 100,
      // timeout: 2000,
      enableHighAccuracy: true
    });
    

    在 iPhone 5 上运行良好,但 Android 只返回错误。现在两者都可以正常工作。我会注意到,我什至尝试过 1 小时 maximumAge 和高超时,但没有奏效。这是唯一适用于所有场景的解决方案。

    【讨论】:

      【解决方案2】:

      我认为这是一个相对常见的问题,尤其是对于 Android 设备。我遇到的一些流行的解决方案包括

      1. 不要指定错误回调:由于某些非常奇怪的原因,这可行,如果未启用 GPS,您唯一的问题将出现。不过,我不建议在生产应用中这样做。

      2. 在您的选项中指定 enableHighAccuracy: true。这似乎有效,但不能单独使用,请参阅下面的#3

      3. 在选项中指定 maximumAge:我使用这个并将它设置得非常高,可能是 1 小时。它的作用是,即使当前没有 GPS,cordova 也会为您提供最近一小时内捕获的最后已知坐标,因此这实际上取决于您希望坐标相对于时间的准确度。

      我通常使用 #2 和 #3 的组合,这对于 Phonegap 3.x 来说是合理的。

      另一方面,您可以在错误回调中包含一个选项,通过设备设置的插件启动 Intent,以便用户可以在禁用时启用其 GPS(就像手机上的谷歌地图一样,当您使用它时导航)。

      我希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        假设您在 Android 模拟器中遇到此问题:

        1. 添加超时并设置 enableHighAccuracy:

          navigator.geolocation.getCurrentPosition(onSuccess, onError, {timeout: 10000, enableHighAccuracy: true});
          

          在某些模拟器中,您需要将 enableHighAccuracy 设置为 false,所以如果仍然不起作用,请尝试。

        2. 在 Android 中,模拟器不读取 GPS 值,因此我们需要通过命令行发送它们。我们需要在模拟器运行的端口中启动一个telnet会话(你可以在模拟器窗口标题中查看端口,开头的数字,在我的例子中是5554):

          telnet localhost 5554
          

        然后运行命令

            geo fix -122.4 37.78
        

        如果您关闭应用程序,您需要重新发送地理位置,所以如果它不起作用,只需在打开应用程序后,在超时事件触发之前运行geo fix 命令即可。

        如果您使用的是真正的 Android 设备,请确保它已启用 GPS,并且您已安装地理定位插件(运行 phonegap local plugin add org.apache.cordova.geolocation

        【讨论】:

        • iOS模拟器上的高精度错误修复了问题!谢谢
        【解决方案4】:

        Phonegap 使用与 Geolocation API 相同的接口,您也可以在没有 Phonegap 库的常规 Web 应用程序中使用它。

        来自the specs

        TIMEOUT(数值 3)
        在实现成功获取新的 Position 对象之前,超时属性指定的时间长度已经过去。

        因此您可以尝试提供更高的超时值作为参数。如果您唯一的提供者是 GPS,那么 10 秒是非常短的时间。在这种情况下,即使在户外,修复也可能需要 40 到 60 秒。

        【讨论】:

        • 我已将超时时间增加到 30000 但仍然没有运气
        • 您是否在支持 GPS 的手机中进行测试?尝试 90 秒,然后去户外。您应该能够得到修复
        • 到户外设置超时时间为 100000 仍然无效,不断收到超时消息。有什么帮助吗?
        【解决方案5】:

        此故障的另一个原因(这是我的情况)是手动安装 apk 并且未向应用授予相关权限。例如:

        网络通信:查看 Wi-Fi 状态,创建蓝牙连接, 完全上网,查看网络状态

        您的位置:访问额外的位置提供程序命令,很好 (GPS) 位置,用于测试的模拟位置源,粗略(基于网络) 位置

        +关于权限的信息:http://developer.android.com/guide/topics/security/permissions.html

        【讨论】:

          【解决方案6】:

          我用 ngCordova 尝试过 cordova-plugin-geolocation 但它总是返回超时错误,这意味着它无法在我设置的 5 分钟超时内获取设备的位置,因此至少适用于 Android 5.1 的最终解决方案: 我已将权限添加到AndroidManifest.xml

          <uses-permission android:name="android.permission.INTERNET" />
          <uses-permission android:name="android.permission.NETWORK_ACCESS" />
          <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
          <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
          <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
          <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
          <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
          

          如果没有ACCESS_WIFI_STATE 许可,它就无法工作。

          现在即使没有 sim 卡也可以工作,连接 wifi 并启用位置。

          以防万一有人觉得它有帮助。

          【讨论】:

          • 我在 Ionic 3 上使用带有 Ionic 本机的 Cordova 地理定位插件。它不起作用,如果我使用超时值,我会收到超时错误。如果没有超时值,我永远不会有回应。 GPS 已在 Android 平板电脑上启用,状态栏上的 gps 图标出现。我从来没有回复过坐标
          猜你喜欢
          • 1970-01-01
          • 2023-04-06
          • 1970-01-01
          • 2017-01-24
          • 1970-01-01
          • 2018-09-19
          • 2012-07-31
          • 1970-01-01
          • 2015-07-06
          相关资源
          最近更新 更多