Как регулярно обновлять позицию HTML5 в WebView (с помощью FINE_ACCURACY) - PullRequest
3 голосов
/ 18 декабря 2011

Я разрабатываю приложение для отслеживания моего телефона через регулярные промежутки времени (не только в первый раз) при navigator.geolocation.getCurrentPosition(), работающем на странице HTML5, работающей в веб-представлении webkit, работающем в приложении для Android 2.1.

Я уже прочитал ответы на следующие вопросы:

Использование navigator.geolocation.getCurrentPosition в WebView на Android 2.0+ (связано с PhoneGap)
Android: использование html5 для определения геолокации в веб-просмотре с помощью javascript api
При веб-просмотре невозможно загрузить геолокацию
Android WebView с использованием GeolocationPermissions

Мне удалось получить позицию с помощью метода javascript navigator.geolocation.getCurrentPosition(), даже если с очень плохой точностью (1421 метр).

Но настоящая проблема заключается в том, что если я вызываю метод getCurrentPosition() более одного раза, он всегда возвращает мне одну и ту же позицию и всегда с одинаковой плохой точностью (1421 метр). Похоже, что один из этих 2 случаев происходит:

  1. Устройство не получает местоположение от датчика GPS (точная точность), но оно получает его через AGPS (от ячейки 3g), в результате чего возвращается та же позиция и точность. Датчик GPS, очевидно, включен, и я установил нужные права в файле манифеста:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_GPS" />
    <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
    <uses-permission android:name="android.permission.ACCESS_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
  2. Устройство правильно получило первую позицию после вызова «getCurrentPosition», но при следующем вызове этого метода позиция возвращается из некоторого «кэша GPS», и позиция на самом деле не получается с датчика GPS.

Кто-нибудь успешно обновлял позицию через регулярные интервалы с помощью getCurrentPosition() HTML5 метода Javascript?

1 Ответ

2 голосов
/ 19 декабря 2011

Я обнаружил, что телефонам (по крайней мере, с iPhone) обычно требуется три проверки для получения точного показания, почти как если бы они триангулировали положение. Проблема, как вы обнаружили, заключается в том, что каждый новый вызов getCurrentPosition() кажется «слепым», поэтому он не становится более точным (результаты меняются, когда вы запускаете эту функцию на настольном компьютере / ноутбуке).

Решение geolocation.watchPosition(). Эта функция использует предыдущие вызовы для повышения точности. Примерно через пять секунд он будет настолько точным, насколько это возможно (если вы не двигаетесь), поэтому вы прекращаете проверку. Кроме того, он перестанет проверять всякий раз, когда думает, что не станет более точным. Используйте window.setTimeout() для управления интервалом.

Демо: http://jsfiddle.net/ThinkingStiff/yn3Bq/

HTML:

<div id="result"></div>

Сценарий:

var latitude, longitude, accuracy;

function setGeolocation() {
    var geolocation = window.navigator.geolocation.watchPosition( 
        function ( position ) {
            latitude = position.coords.latitude;
            longitude = position.coords.longitude;
            accuracy = position.coords.accuracy;
            document.getElementById( 'result' ).innerHTML += 
                  'lat: ' + latitude + ', '
                + 'lng: ' + longitude + ', '
                + 'accuracy: ' + accuracy + '<br />';
        }, function () { 
            /*error*/ 
        }, {
            maximumAge: 250, 
            enableHighAccuracy: true
        } 
    );
    window.setTimeout( function () {
            window.navigator.geolocation.clearWatch( geolocation ) 
        }, 
        5000 //stop checking after 5 seconds
    );
};

setGeolocation();

window.setTimeout( function () {
        setGeolocation();
    }, 
    30000 //check every 30 seconds
);

Выход:

широта: 35,5830119, язык: -124,4871223, точность: 40
широта: 35.5829974, lng: -124.4871525, точность: 30

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...