Подтвердить что ты не робот

Используйте PhoneGap для проверки включенности GPS

Я создаю приложение, используя PhoneGap. При использовании Geolocation API для телефонных разговоров я понял, что API-интерфейсы тайм-аут по двум причинам и одна и та же ошибка: 1. Если GPS не включен на пользовательском устройстве 2. Если GPS включен и не может получить местоположение пользователя (может быть несколько причин, неисправный GPS, непонятная погода и т.д.)

У меня проблема с дифференциацией причины? Любые мысли о том, как это сделать?

Мне было интересно, есть ли способ, я могу проверить, активен ли GPS на пользовательском устройстве с помощью Phonegap, поэтому я могу сделать это как отдельную проверку и прямому пользователю в окне настроек, где обычно устанавливаются настройки GEO. Не знаете, как это сделать? пользовательский плагин телефонной карты может быть?

4b9b3361

Ответ 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