使用phonegap的android地理定位代码:3错误

使用phonegap的android地理定位代码:3错误,android,cordova,Android,Cordova,我正在尝试使用PhoneGap API文档使用地理定位,但收到下面的错误消息 警觉的 代码:3 消息:超时已过期 我的密码是 <script> // Wait for Cordova to load // document.addEventListener("deviceready", onDeviceReady, false); var watchID = null; // Cordova is ready // function onDeviceReady() {

我正在尝试使用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');
}

//等待Cordova加载
//
文件。添加的监听器(“deviceready”,OnDeviceraddy,false);
var-watchID=null;
//科尔多瓦准备好了
//
函数ondevicerady(){
//如果每30秒未收到更新,则引发错误
var选项={timeout:10000};
watchID=navigator.geolocation.watchPosition(onSuccess、onError、options);
}
//成功地理定位
//
成功时的功能(位置){
var element=document.getElementById('geolocation');
element.innerHTML='Latitude:'+position.coords.Latitude+'
'+ '经度:'+position.coords.Longitude+'
'+ “
”+element.innerHTML; } //OneError回调接收PositionError对象 // 函数onError(错误){ 警报('code:'+error.code+'\n'+ '消息:'+error.message+'\n'); }


请告诉我缺少什么。

Phonegap使用与地理定位API相同的接口,您也可以在没有Phonegap库的常规web应用程序中使用该接口

发件人:

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


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

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

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

  • 在选项中指定EnableHighAccurance:true。这似乎是可行的,但其本身并不可行,见下文第3段

  • 在选项中指定maximumAge:我使用这个选项,并将其设置为很高,可能为1小时。它所做的是,即使目前没有GPS,cordova也会给你最后一个小时内捕获的已知坐标,因此这实际上取决于你希望坐标相对于时间的准确度

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

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


    我希望这能有所帮助。

    假设您在Android仿真器中遇到此问题:

  • 添加超时并设置EnableHighAccurance:

    navigator.geolocation.getCurrentPosition(onSuccess, onError, {timeout: 10000, enableHighAccuracy: true});
    
    在某些模拟器中,您需要将EnableHighAccurance设置为false,所以如果仍然不起作用,请尝试

  • 在Android中,模拟器不读取GPS值,所以我们需要通过命令行发送它们。我们需要在emulator正在运行的端口中启动telnet会话(您可以在emulator窗口标题中检查端口,在我的示例5554中,检查开头的编号):

  • 然后运行命令

        geo fix -122.4 37.78
    
    如果关闭应用程序,则需要重新发送地理位置信息,因此,如果该信息不起作用,只需在打开应用程序之后,在触发超时事件之前运行
    geo-fix
    命令即可


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

    此错误的另一个原因(我的情况下)是手动安装apk,而不授予应用程序相关权限。例如:

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

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


    +关于权限的信息:

    我解决了运行最新Android(物理设备)的HTC M8的这个问题,没有指定最大值和超时

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

    在iPhone5上,它工作正常,但Android只返回错误。现在两者都可以顺利工作了。我会注意到,我甚至尝试了1小时最大值和高超时,但都没有成功。这是唯一适用于所有场景的解决方案。

    我用ngCordova尝试了cordova插件地理定位,但它总是返回超时错误,这意味着它无法在我设置的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" />
    
    
    
    没有
    访问WIFI\u状态
    许可,它无法工作

    现在它甚至可以在没有sim卡的情况下工作,连接了wifi并启用了位置


    以防有人会觉得它很有用。

    我已经将超时时间增加到30000,但仍然没有luckAre您在启用GPS的手机上进行测试?试着用90秒去户外。你应该能够得到一个修复去户外和设置超时100000仍然不起作用,继续得到超时消息。有什么帮助吗?iOS模拟器上的高精度错误修复了这个问题!谢谢,我在爱奥尼亚3上使用带有爱奥尼亚原生版的cordova地理定位插件。它不工作,如果我使用超时值,我会收到一个超时错误。如果没有超时值,我永远不会有响应。Android平板电脑上已启用GPS,状态栏上的GPS图标将出现。我从来没有回应过coords
    <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" />