che*_*xis 1 android cordova cordova-plugins
我有一个使用 Cordova 的应用程序,我已经从官方存储库安装了这个插件:
插件安装:cordova plugin add 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 进行测试。
谢谢!!
在 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)
| 归档时间: |
|
| 查看次数: |
2589 次 |
| 最近记录: |