带有cordova的Android地理定位不会触发回调错误

che*_*xis 1 android cordova cordova-plugins

我有一个使用 Cordova 的应用程序,我已经从官方存储库安装了这个插件:

插件安装:cordova plugin add cordova-plugin-geolocation

存储库:https : //github.com/apache/cordova-plugin-geolocation

设备就绪事件:

onDeviceReady: function() {
            app.receivedEvent('deviceready');
            console.log('deviceready');
             loadPosition();

        }
Run Code Online (Sandbox Code Playgroud)

在 deviceready 事件中,我调用了这个函数:

负载位置功能:

function loadPosition() {

    // onSuccess Callback
    // This method accepts a Position object, which contains the
    // current GPS coordinates
    //
    var onSuccess = function (position) {

        localStorage.setItem("latitude", position.coords.latitude);
        localStorage.setItem("longitude", position.coords.longitude);
        localStorage.setItem("position", true);


    };

    // onError Callback receives a PositionError object
    //
    function onError(error) {
        localStorage.setItem("position", false);
        alertErrorPosition();
    }

    function alertErrorPosition() {
        navigator.notification.alert(
            'Necesitamos utilizar tu ubicación para poder hacer funcionar la aplicación. Reinicia la aplicación o vuélve a instalarla . Gracias.',  // message
            null,         // callback
            '¡Error!',            // title
            'Ok'                  // buttonName
            );
    }

    navigator.geolocation.getCurrentPosition(onSuccess, onError);
}
Run Code Online (Sandbox Code Playgroud)

问题:

在 Android 上,如果 App 无法获取定位(例如,GPS 未激活),我看不到警报错误,但在 iOS 上,如果用户拒绝访问,我可以看到错误警报。

如果用户激活了 GPS,我没有任何问题,应用程序正确获取纬度和经度。

我已经在模拟器和真实设备中对其进行了测试。我正在使用 Android Studio 进行测试。

谢谢!!

Dav*_*den 5

在 Android 设备上关闭 GPS 的效果(例如将设置位置模式更改为“省电”)因 Android 版本而异:操作系统永远无法检索高精度位置,因此会出现 TIMEOUT 错误(PERMISSION_DENIED将不会在 Android 上接收)或低精度位置将被检索并使用 Wifi/蜂窝三角测量传递。

我建议使用 watchPosition() 而不是 getCurrentPosition() 来检索位置;getCurrentPosition() 对当前时间点的设备位置发出单个请求,因此在设备上的 GPS 硬件有机会获得定位之前,可能会发生位置超时,而使用 watchPosition() 您可以设置一个每次操作系统从 GPS 硬件接收到位置更新时,watcher 都会调用成功函数。如果您只想要一个位置,请在收到足够准确的位置后清除观察者。如果添加watcher时Android设备关闭GPS,会继续返回TIMEOUT错误;我的解决方法是在出现多次连续错误后清除并重新添加观察者。在第一次添加观察者之前,你可以使用这个插件可以检查 GPS 是否打开,如果没有,提供将用户重定向到 Android 位置设置页面,以便他们可以打开它。

所以沿着这些路线:

var MAX_POSITION_ERRORS_BEFORE_RESET = 3,
MIN_ACCURACY_IN_METRES = 20,
positionWatchId = null, 
watchpositionErrorCount = 0,
options = {
    maximumAge: 60000, 
    timeout: 15000, 
    enableHighAccuracy: true
};

function addWatch(){
    positionWatchId = navigator.geolocation.watchPosition(onWatchPositionSuccess, onWatchPositionError, options);
}

function clearWatch(){
    navigator.geolocation.clearWatch(positionWatchId);
}

function onWatchPositionSuccess(position) {
    watchpositionErrorCount = 0;

    // Reject if accuracy is not sufficient
    if(position.coords.accuracy > MIN_ACCURACY_IN_METRES){
      return;        
    }

    // If only single position is required, clear watcher
    clearWatch();

    // Do something with position
    var lat = position.coords.latitude,   
    lon = position.coords.longitude;
}


function onWatchPositionError(err) {
    watchpositionErrorCount++;
    if (err.code == 3 // TIMEOUT
        && watchpositionErrorCount >= MAX_POSITION_ERRORS_BEFORE_RESET) {        
        clearWatch();
        addWatch();
        watchpositionErrorCount = 0;
    }

}

function checkIfLocationIsOn(){
    cordova.plugins.diagnostic.isLocationEnabled(function(enabled){
            console.log("Location is " + (enabled ? "enabled" : "disabled"));
            if(!enabled){
                navigator.notification.confirm("Your GPS is switched OFF - would you like to open the Settings page to turn it ON?", 
                    function(result){
                        if(result == 1){ // Yes
                            cordova.plugins.diagnostic.switchToLocationSettings();
                        }
                    }, "Open Location Settings?");
            }else{
                if(positionWatchId){
                    clearWatch();
                }
                addWatch();
            }
        }, function(error){
            console.error("The following error occurred: "+error);
        }
    );
}

document.addEventListener("deviceready", checkIfLocationIsOn, false); // Check on app startup
document.addEventListener("resume", checkIfLocationIsOn, false); // Check on resume app from background
Run Code Online (Sandbox Code Playgroud)