Геолокация всегда в приложении Cordova

Я работаю над приложением Sencha Touch (2.3.1), упакованным с использованием Cordova 3.5.0-0.2.7. Я пытаюсь прочитать координаты GPS, используя:

navigator.geolocation.getCurrentPosition()

Но запрос на Android-телефонах всегда истекает, а в эмуляторе Chrome он работает нормально. Я попытался с помощью watchPosition() также.

Любая помощь приветствуется.

3 ответа

Решение

Если вы еще этого не сделали, установите в свой проект https://github.com/apache/cordova-plugin-geolocation - т.е. cordova plugin add cordova-plugin-geolocation - это добавит соответствующие разрешения к вашему манифесту Android, поскольку Mike Dailor справедливо указывает, что вам нужно.

Какие параметры вы передаете в качестве третьего параметра getCurrentPosition()? Объект geolocationOptions имеет 3 свойства: timeout, maxAge и enableHighAccuracy.

Предполагая, что вы хотите получить точное местоположение (например, приложение GPS слежение / тип спутниковой навигации), настройка enableHighAccuracy: true заставляет ваше приложение запрашивать у ОС восстановление позиции с помощью оборудования GPS. В этом случае вы хотите установить значение тайм-аута, которое дает достаточно времени для оборудования GPS, чтобы получить исправление в первый раз, в противном случае тайм-аут произойдет до того, как у него появится шанс получить исправление.

Также имейте в виду, что эффект отключения GPS на устройстве Android (например, изменение параметра "Режим местоположения" на "Экономия заряда аккумулятора") зависит от версии Android: либо ОС никогда не сможет получить положение с высокой точностью, поэтому возникает ошибка TIMEOUT (PERMISSION_DENIED не будет получена на Android), или вместо этого будет получена и передана позиция с низкой точностью с использованием триангуляции Wi-Fi/ ячейки.

Я бы предложил использовать watchPosition() вместо getCurrentPosition() для получения местоположения; getCurrentPosition() делает один запрос позиции устройства в данный текущий момент времени, поэтому тайм-аут позиции может произойти до того, как оборудование GPS на устройстве получит шанс определить местоположение, тогда как с помощью watchPosition() вы можете настроить наблюдатель, который будет вызывать функцию успеха каждый раз, когда ОС получает обновление местоположения от оборудования GPS. Если вам нужно только одно местоположение, очистите наблюдателя после получения положения с достаточной точностью. Если GPS-устройство отключено на устройстве Android при добавлении наблюдателя, он продолжит возвращать ошибку TIMEOUT; Мой обходной путь для этого - очистить и повторно добавить наблюдателя после ряда последовательных ошибок.

Итак, что-то вроде этого:

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

}
addWatch();

Боролся с этими проблемами, пока я не нашел этот плагин => https://github.com/louisbl/cordova-plugin-locationservices.

Плагин существует главным образом потому, что плагин Cordova Geolocation больше не использует код Android: https://issues.apache.org/jira/browse/CB-5977. Он опирается на геолокационные возможности WebView. Не знаю, почему никто не говорит об этом.

Вот фрагмент моего кода:

 $ scope.getCordinates = function () {

       if (window.cordova) {
        var PRIORITY_BALANCED_POWER_ACCURACY = 102;
        var posOptions = { maximumAge: 1000, timeout: 20000,enableHighAccuracy: false, priority: PRIORITY_BALANCED_POWER_ACCURACY };
        cordova.plugins.locationServices.geolocation.getCurrentPosition(function(position) {

             if(Location.init(position.coords.latitude,position.coords.longitude)){

               $scope.Data.latitude = position.coords.latitude;
               $scope.Data.longitude = position.coords.longitude;
               //Toast.show('Getting Location...', 'short', 'top');

               }else{
                $scope.Data.latitude = '';
                $scope.Data.longitude = '';
                Toast.show('Turn on Location access in settings for better sales tracking..', 'short', 'bottom');
              }
            console.log(position);

          }, function(error) {
            $scope.Data.latitude = '';
            $scope.Data.longitude = '';
            Toast.show('Error encountered with Geolocation Api', 'short', 'bottom');
            console.log(error);

          }, posOptions);
        }

     }

У меня была та же проблема, и я нашел решение, сделав это:

  1. Добавьте белый список плагинов: добавьте ионный плагин https://github.com/apache/cordova-plugin-whitelist.git

  2. Не забывайте устанавливать npm каждый раз, когда вы меняете зависимости.

Я думаю, что эта проблема была реализована с разрешениями, и белый список решает ее.

Удачи!

Другие вопросы по тегам