如果定位服务关闭,Intel XDK Geolocation 将找不到 Lat/Long

Intel XDK Geolocation won't find Lat/Long if location services off

我正在使用英特尔 XDK 开发一个应用程序,我专门用 android (Nexus 6P) 进行测试。

我已经添加了 Cordova Geolocation 插件以及 Google Cordova 的定位服务,并在我的定位服务开启的情况下进行了测试,它正确地获得了两个插件的位置。

但是,当我关闭定位服务时,什么也没有出现。

这是我目前用来获取位置的代码:

document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
    var Geo={};
    if (navigator.geolocation) {
        console.log('Started location');
        console.log(cordova.plugins.locationServices.geolocation.getCurrentPosition(success, error));
        //navigator.geolocation.getCurrentPosition(success, error, {enableHighAccuracy:true, maximumAge:Infinity, timeout:100000});
    }

    //Get the latitude and the longitude;
    function success(position) {
        console.log('SUCCESS location');
        Geo.lat = position.coords.latitude;
        Geo.lng = position.coords.longitude;
        populateHeader(Geo.lat, Geo.lng);
    }

    function error(){
        console.log("Geocoder failed");
    }

    function populateHeader(lat, lng){
        $('#Lat').attr('data-lat', lat);
        $('#Long').attr('data-long',lng);
    }
}

我想要的是一种要求用户打开位置数据的方法,或者更好的方法是在不需要位置服务的情况下获取用户的位置。

你说 "when I switch off location services" 我假设你的意思是你已经进入 Android 设置并禁用了 "Location History" 或关闭了设备上的共享 "Location"。在这种情况下,您不会获得任何数据,因为用户已选择不共享该信息。请参阅这两个插件的自述文件中的警告,这被认为是非常敏感的数据,因此,Android 已赋予用户控制共享此信息的能力。

我不知道是否有 API 可以明确告诉您该数据是否已被用户禁用。无论如何,您可能应该报告您无法获得所需的数据,这可能是由于多种原因造成的:

  • 用户已禁用位置数据共享
  • 设备此时无法检索当前位置
  • 当前"location mode"不允许检索位置

然后提出一些关于更改或修复内容的建议,以便收集和使用该数据。当然,如果用户对与您的应用共享该信息不感兴趣,您必须优雅地遵守。


编辑 2017 年 2 月 23 日:请参阅下面的评论,了解一些有助于确定定位服务是否可用的插件。

你必须通过"options"来判断“超时”的时间所以return错误! =)

function cbSucessGeo(p)
{
    console.log(p); //current GPS coordinates
}

function cbFailGeo(e)
{
    switch(e.code)
    {
        case 1:
            alert("PERMISSION DENIED");
            break;
        case 2:
            alert("POSITION_UNAVAILABLE");
            break;
        case 3:
            alert("TIMEOUT");
            break;
        default:
            alert("UNKNOWN ERROR");
            break;
    }
}

var options = { timeout: 5000, maximumAge: 0, enableHighAccuracy: true };

navigator.geolocation.getCurrentPosition(cbSucessGeo, cbFailGeo, options);

如果 GPS 关闭,则在超时间隔(如果指定)后调用 onError 回调。如果未指定超时参数,则不会调用任何回调。

和平! =)