2015-07-23 2 views
3

Я пишу приложение, Кордова/PhoneGap и я использую плагин геолокации ... это мой код ...Кордова/PhoneGap геолокация плагина управления ошибкой

var onSuccess = function(position) { 
    longitude = position.coords.longitude; 
    latitude = position.coords.latitude; 

    console.log("Latitude: "+position.coords.latitude); 
    console.log("Longitude: "+position.coords.longitude); 
}; 

function onError(error) { 
    logService.debug("Code: "+error.code); 
    logService.debug("Message: "+error.message); 
}; 

navigator.geolocation.getCurrentPosition(onSuccess, onError, { maximumAge: 3000, timeout: 15000, enableHighAccuracy: true }); 

Теперь я проверить его в браузере и когда я не получаю разрешения, я получаю код ошибки 1 (PositionError.PERMISSION_DENIED), когда я делаю это разрешение, он очень хорошо работает в браузере ... Теперь родился вопрос ... Когда я тестирую это на устройстве, и GPS отключен Я не получаю код ошибки 1 (PositionError.PERMISSION_DENIED), но получаю всегда тайм-аут ... таким образом, я не различаю разницу ... Я установил тайм-аут на 150000, но всегда получаю код 3 (PositionError.TIMEOUT)...Зачем? Как можно использовать его в строгом смысле?

+0

то, что вы хотите на самом деле, когда device's GPS выключен? позволить пользователю включить его? –

+0

Я хочу прочитать в моей консоли ... код 1 (PositionError.PERMISSION_DENIED) или код 2 (PositionError.POSITION_UNAVAILABLE) ... он не всегда должен быть тайм-аут ... – Ragnarr

+0

, даже если GPS выключен, он должен быть способный получить позицию из сети 3G, Wi-Fi и т. д. В любом случае, плагин геолокации использует собственный веб-просмотр, построенный в геолокации, поэтому вините google (по вине, которое я действительно имею в виду, откройте проблему на трекере по проблеме Android) – jcesarmobile

ответ

0

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

Я бы предложил использовать 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 (watchpositionErrorCount >= MAX_POSITION_ERRORS_BEFORE_RESET) {   
     clearWatch(); 
     addWatch(); 
     watchpositionErrorCount = 0; 
    } 

} 
addWatch(); 
Смежные вопросы