Используйте PhoneGap для проверки включенности GPS
Я создаю приложение, используя PhoneGap. При использовании Geolocation API для телефонных разговоров я понял, что API-интерфейсы тайм-аут по двум причинам и одна и та же ошибка:
1. Если GPS не включен на пользовательском устройстве
2. Если GPS включен и не может получить местоположение пользователя (может быть несколько причин, неисправный GPS, непонятная погода и т.д.)
У меня проблема с дифференциацией причины? Любые мысли о том, как это сделать?
Мне было интересно, есть ли способ, я могу проверить, активен ли GPS на пользовательском устройстве с помощью Phonegap, поэтому я могу сделать это как отдельную проверку и прямому пользователю в окне настроек, где обычно устанавливаются настройки GEO. Не знаете, как это сделать? пользовательский плагин телефонной карты может быть?
Ответы
Ответ 1
Вы можете проверить код ошибки в PositionError параметр geolocationError в своем обращении к getCurrentPosition. Я предполагаю, что это будет PositionError.PERMISSION_DENIED, когда gps не включен, и PositionError.POSITION_UNAVAILABLE или PositionError.TIMEOUT, когда gps включен, но есть и другие проблемы.
Обратите внимание, что это зависит от платформы. Вам, вероятно, придется написать надуманное сообщение об ошибке, в котором говорится: "Не удалось получить текущую позицию. Либо сигналы GPS слабы, либо GPS отключен".
Одна вещь, которую вы можете попробовать, - вызвать getCurrentPosition с невероятно малым временем ожидания, скажем, 1 мс. Если он говорит, что разрешение отклонено, вы можете сделать вывод о том, что gps отключен, и если он истечет, вы можете предположить, что gps включен. У меня нет времени, чтобы проверить это, вы, вероятно, можете отредактировать этот ответ в результате своих тестов.
Еще одна вещь, которую вы можете попробовать, - использовать диагностический плагин phonegap для android. Вам также нужно будет убедиться, что вы используете плагины для других платформ, но они все также есть.
Ответ 2
Чтобы обработать этот случай наиболее изящно, вы можете использовать cordova.plugins.diagnostic
, чтобы проверить, включена ли настройка GPS и (на Android 6+), проверьте если приложение имеет авторизацию во время выполнения и (если оно не включено), используйте cordova-plugin-request-location-accuracy
для автоматического включения GPS через собственный диалог без необходимости пользователям вручную включить его с помощью страницы настроек. Однако, поскольку последняя основана на обновленной библиотеке Google Play Services на устройстве, хорошей практикой является отказ от ручного переключения, если автоматическое переключение прерывается.
![Example app demo]()
Сначала добавьте необходимые модули в свой проект:
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
Ответ 3
У меня была аналогичная проблема с некоторыми устройствами. Удалось выполнить его с помощью кода ниже:
var options = {maximumAge: 0, timeout: 10000, enableHighAccuracy:true};
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
Ответ 4
Я попробовал решение DaveAlden выше, но это не сработало, частично потому, что первая функция, которую он называет cordova.plugins.diagnostic.isGpsLocationAvailable()
, - это Android только для плагин docs.
Как он говорит, сначала добавьте два плагина:
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
Надеюсь, это поможет кому-то еще, кто приходит с этим ответом.
Ответ 5
Использование платформы apache cordova 3 для Android
В файле GeoBroker.java по методу exectute добавьте следующее действие после создания экземпляра 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);
}
Затем в файле 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", []);
}
Надеюсь, что это поможет
Ответ 6
Просто для новых пользователей, перенаправленных здесь, есть плагин (который начался примерно в середине 2014 года), который называется плагин диагностики Cordova:
Этот плагин Cordova/Phonegap для iOS, Android и Windows 10 Mobile используется для управления настройками устройства, такими как местоположение, Bluetooth и WiFi. Он позволяет управлять разрешениями во время выполнения, аппаратными средствами устройства и основных функций ОС. ref