Navigator.geolocation.getCurrentPosition всегда получает тайм-аут в Android до тех пор, пока GPS/Местоположение не будет

app.controller('dashboard', function($scope){
    $scope.getPosition = function(position){
        $scope.acc = position.coords;
        $scope.lat = position.coords.latitude;
        $scope.lng = position.coords.longitude;
        $scope.$apply();
    };
    $scope.getPositionErr = function(error){
        alert('code: '    + error.code    + '\n' +
                  'message: ' + error.message + '\n');
    };
    navigator.geolocation.getCurrentPosition($scope.getPosition, $scope.getPositionErr, {maximumAge: 0, timeout: 6000, enableHighAccuracy:false});
});

Я использую Angular JS и Cordova для Android-приложения. Этот код отлично работает на рабочем столе, но не на Nexus 4 с Lollipop. Также код контроллера выполняется после deviceready в соответствии с требованием Кордовы

Я пробовал

  • Настройка HighAccuracy на false
  • Удаление плагина геолокации, чтобы он использовал местоположение по умолчанию из Wifi
  • Перезагрузка устройства
  • Очистка кеша браузера
  • Включение/выключение режима полета
  • Включение/выключение Wi-Fi
  • Включение/выключение мобильных данных

Но я не могу получить lat, long и geolocation всегда получает таймаут.

Он работает, только когда я установил параметр Location/GPS. После включения кода он работает как ожидалось.

Ответ 1

navigator.geolocation.getCurrentPosition предназначен только для GPS, если опция "enableHighAccuracy" установлена ​​как "истина" (по умолчанию). Вот почему вы не можете получить текущее местоположение с помощью мобильного устройства. О "он работает на рабочем столе", я считаю, что вы должны открыть GPS-настройки в своем браузере.

Обычно я использовал код ниже t o получить позицию независимо от того, открыт ли GPS, или нет.

var positionOption = { timeout: 500, enableHighAccuracy: true };
var gpsSunccuss = function(currentPosition) {
    //use gps position
};
var gpsFailed = function() {
    //use some 3rd party position solution(get position by your device ip)
    getPositionBy3rdParty();
};
navigator.geolocation.getCurrentPosition(gpsSunccuss, gpsFailed, positionOption);

С другой стороны, вы можете установить enableHighAccuracy как "false".

Ответ 2

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

  {enableHighAccuracy:false,maximumAge:Infinity, timeout:60000}

Ответ 3

Вы можете попробовать это.

{enableHighAccuracy:true, Infinity:Infinity, timeout:2000}