我正在使用PhoneGap构建应用。在使用phonegap的Geolocation API时,我意识到API超时有两个原因并且抛出相同的错误: 1.如果用户设备上未启用GPS 2.如果GPS已启用且无法获取用户的位置(可能有多种原因,GPS故障,天气不明等)
我在区分原因方面遇到了问题?有关如何做的任何想法?
我想知道是否有任何方法,我可以使用Phonegap检查用户设备上的GPS是否处于活动状态,这样我就可以将其作为单独检查并将用户引导到通常放置GEO设置的设置窗口。不知道怎么做?自定义phonegap插件可能是?
答案 0 :(得分:37)
您可以在PositionError的来电中查看geolocationError getCurrentPosition参数中的错误代码。我猜测,当gps未启用时,它将是PositionError.PERMISSION_DENIED;当启用gps时,它会是PositionError.POSITION_UNAVAILABLE或PositionError.TIMEOUT,但还有其他问题。
请注意,这取决于平台。您可能不得不写一条设计错误消息,上面写着“无法获取当前位置.GPS信号很弱或GPS已关闭”。
你可以尝试的一件事是用一个非常小的超时调用getCurrentPosition,比如1 ms。如果它说权限被拒绝,您可以断定gps已被禁用,如果超时,您可以假设已启用gps。我没有时间对此进行测试,您可以根据测试结果编辑此答案。
您可以尝试的另一件事是使用diagnostic phonegap plugin for android。你必须确保你也使用其他平台的插件,但它们也都在那里。
答案 1 :(得分:6)
为了最优雅地处理这种情况,您可以使用cordova.plugins.diagnostic
检查是否启用了GPS设置,并且(在Android 6+上)检查应用是否具有运行时授权,以及(如果未启用),请使用cordova-plugin-request-location-accuracy
通过原生对话框自动开启GPS,无需用户通过设置页面手动开启。但是,由于后者依赖于设备上的最新Google Play服务库,因此如果自动切换失败,最好还是回退到手动切换。
首先将所需的插件添加到项目中:
cordova plugin add cordova.plugins.diagnostic --save
cordova plugin cordova-plugin-request-location-accuracy --save
然后你会这样做:
function checkAvailability(){
cordova.plugins.diagnostic.isGpsLocationAvailable(function(available){
console.log("GPS location is " + (available ? "available" : "not available"));
if(!available){
checkAuthorization();
}else{
console.log("GPS location is ready to use");
}
}, function(error){
console.error("The following error occurred: "+error);
});
}
function checkAuthorization(){
cordova.plugins.diagnostic.isLocationAuthorized(function(authorized){
console.log("Location is " + (authorized ? "authorized" : "unauthorized"));
if(authorized){
checkDeviceSetting();
}else{
cordova.plugins.diagnostic.requestLocationAuthorization(function(status){
switch(status){
case cordova.plugins.diagnostic.permissionStatus.GRANTED:
console.log("Permission granted");
checkDeviceSetting();
break;
case cordova.plugins.diagnostic.permissionStatus.DENIED:
console.log("Permission denied");
// User denied permission
break;
case cordova.plugins.diagnostic.permissionStatus.DENIED_ALWAYS:
console.log("Permission permanently denied");
// User denied permission permanently
break;
}
}, function(error){
console.error(error);
});
}
}, function(error){
console.error("The following error occurred: "+error);
});
}
function checkDeviceSetting(){
cordova.plugins.diagnostic.isGpsLocationEnabled(function(enabled){
console.log("GPS location setting is " + (enabled ? "enabled" : "disabled"));
if(!enabled){
cordova.plugins.locationAccuracy.request(function (success){
console.log("Successfully requested high accuracy location mode: "+success.message);
}, function onRequestFailure(error){
console.error("Accuracy request failed: error code="+error.code+"; error message="+error.message);
if(error.code !== cordova.plugins.locationAccuracy.ERROR_USER_DISAGREED){
if(confirm("Failed to automatically set Location Mode to 'High Accuracy'. Would you like to switch to the Location Settings page and do this manually?")){
cordova.plugins.diagnostic.switchToLocationSettings();
}
}
}, cordova.plugins.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY);
}
}, function(error){
console.error("The following error occurred: "+error);
});
}
checkAvailability(); // start the check
答案 2 :(得分:3)
我的某些设备存在类似问题。管理以使用以下代码解决它:
var options = {maximumAge: 0, timeout: 10000, enableHighAccuracy:true};
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
答案 3 :(得分:1)
我尝试过上面的DaveAlden解决方案,但它没有用,部分原因是因为他调用cordova.plugins.diagnostic.isGpsLocationAvailable()
的第一个函数是plugin docs的仅Android版。
正如他所说,首先添加两个插件:
cordova plugin add cordova.plugins.diagnostic --save
cordova plugin cordova-plugin-request-location-accuracy --save
然后添加以下功能:
// Checks to see if GPS is enabled AND if the app is authorized
checkEnabled(){
cordova.plugins.diagnostic.isLocationAvailable(
(available) => { onSuccess(available); },
(error) => { goToSettings(error); }
);
}
onSuccess(available) {
if(available) { // do something };
else goToSettings(available);
}
// Output error to console
// Prompt user to enable GPS, on OK switch to phone settings
goToSettings(error) {
console.log("error: ", error);
if(window.confirm("You need to enable location settings to use the geolocation feature.")) {
cordova.plugins.diagnostic.switchToSettings();
}
}
checkEnabled(); // Run check
希望这可以帮助那些得出这个答案的人。
答案 4 :(得分:0)
使用apache cordova 3 android平台
在exectute方法的GeoBroker.java文件中,在实例化locationManager之后添加以下操作。
if(action.equals("isGPSEnabled")){
PluginResult result;
if ( locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER )){
result = new PluginResult(PluginResult.Status.OK);
}else{
result = new PluginResult(PluginResult.Status.ERROR);
}
callbackContext.sendPluginResult(result);
}
然后在资产的plugins文件夹中的geolocation.js文件中添加公开新功能
/**
* Asynchronously checks if gps is enabled.
*
* @param {Function} successCallback The function to call when gps is enabled.
* @param {Function} errorCallback The function to call when gps is not enabled. (OPTIONAL)
*/
isGPSEnabled:function(successCallback, errorCallback){
exec(successCallback, errorCallback, "Geolocation", "isGPSEnabled", []);
}
希望有所帮助
答案 5 :(得分:0)
对于重定向到这里的新用户,有一个插件(大约在2014年中开始),称为Cordova diagnostic plugin:
适用于iOS,Android和Windows 10 Mobile的Cordova / Phonegap插件 用于管理设备设置,如位置,蓝牙和WiFi。 它可以管理运行时权限,设备硬件和 核心OS功能。
ref