gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 15:47:30 27 4
gpt4 key购买 nike

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

Plugin installation: cordova plugin add cordova-plugin-geolocation

Repository: https://github.com/apache/cordova-plugin-geolocation

设备就绪事件:

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

}

在 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);
}

问题:

在 Android 上,如果 App 无法获取本地化(例如,GPS 未激活),我看不到警告错误,但在 iOS 上,如果用户拒绝访问,我会看到错误警报。

如果用户激活了 GPS,我没有任何问题,App 可以正确获取经纬度。

我已经在模拟器和真机上测试过了。我正在使用 Android Studio 进行测试。

谢谢!!

最佳答案

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

我建议使用 watchPosition() 而不是 getCurrentPosition() 来检索位置; getCurrentPosition() 在当前时间点对设备位置发出单一请求,因此位置超时可能发生在设备上的 GPS 硬件有机会获得定位之前,而使用 watchPosition() 您可以设置一个每次操作系统从 GPS 硬件接收到位置更新时,它将调用成功函数的观察者。如果您只想要一个位置,请在收到足够准确的位置后清除观察者。如果添加watcher时Android设备关闭GPS,会继续返回TIMEOUT错误;我的解决方法是在连续出现一些错误后清除并重新添加观察者。在第一次添加观察者之前,您可以使用 this plugin检查 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

关于带有cordova的Android地理定位不会触发回调错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32250103/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com