Wykrywanie zmian geolokalizacji

Aby można było korzystać z czujnika geolokalizacji, należy utworzyć instancję obiektu Geolocation i przeprowadzić rejestrację dla zdarzeń update , które obiekt ten wywołuje. Zdarzenie update jest obiektem zdarzenia Geolocation. Zdarzenie zawiera osiem właściwości:

  • altitude — Wysokość w metrach.

  • heading — Kierunek ruchu (względem północy prawdziwej) w stopniach.

  • horizontalAccuracy — Dokładność ustalania położenia poziomego w metrach.

  • latitude — Szerokość geograficzna w stopniach.

  • longitude — Długość geograficzna w stopniach.

  • speed — Szybkość w metrach na sekundę.

  • timestamp — Liczba milisekund w czasie zdarzenia, informująca kiedy nastąpiło zainicjowanie środowiska wykonawczego.

  • verticalAccuracy — Dokładność ustalania położenia pionowego w metrach.

Właściwość timestamp jest obiektem int. Pozostałe właściwości są obiektami typu Number.

Poniżej przedstawiono podstawowy sposób wyświetlania danych geolokalizacji w polu tekstowym:

var geo:Geolocation; 
if (Geolocation.isSupported) 
{ 
    geo = new Geolocation(); 
    geo.addEventListener(GeolocationEvent.UPDATE, updateHandler); 
} 
else 
{ 
    geoTextField.text = "Geolocation feature not supported"; 
} 
function updateHandler(event:GeolocationEvent):void 
{ 
    geoTextField.text = "latitude: " + event.latitude.toString() + "\n" 
            + "longitude: " + event.longitude.toString() + "\n" 
            + "altitude: " + event.altitude.toString() 
            + "speed: " + event.speed.toString() 
            + "heading: " + event.heading.toString() 
            + "horizontal accuracy: " + event.horizontalAccuracy.toString() 
            + "vertical accuracy: " + event.verticalAccuracy.toString() 
}

Aby prawidłowo zastosować ten przykład, należy pamiętać o utworzeniu pola tekstowego geoTextField i dodaniu go do listy wyświetlanej przed użyciem tego kodu.

Możliwe jest dostosowanie pożądanych przedziałów czasu dla zdarzeń geolokalizacji poprzez wywołanie metody setRequestedUpdateInterval() obiektu Geolocation. Ta metoda wymaga jednego parametru, interval , który jest żądanym przedziałem czasu między aktualizacjami, wyrażonym w milisekundach.

var geo:Geolocation = new Geolocation(); 
geo.setRequestedUpdateInterval(10000);

Rzeczywisty odstęp czasu między uaktualnieniami danych geolokalizacji może być większy lub mniejszy od tej wartości. Dowolna zmiana w odstępie między uaktualnieniami wpływa na wszystkie zarejestrowane detektory zdarzeń. Jeżeli metoda setRequestedUpdateInterval() nie zostanie wywołana, aplikacja odbiera aktualizacje na podstawie domyślnego przedziału czasu urządzenia.

Użytkownik może zablokować aplikacji dostęp do danych geolokalizacji. Na przykład, w telefonie iPhone wyświetlane jest zapytanie dla użytkownika, gdy aplikacja podejmuje próbę uzyskania dostępu do danych geolokalizacji. W odpowiedzi na to zapytanie użytkownik może nie zezwolić aplikacji na dostęp do danych geolokalizacji. Obiekt Geolocation wywołuje zdarzenie status , gdy użytkownik zablokuje dostęp do danych geolokalizacji. Obiekt Geolocation zawiera również właściwość muted , która jest ustawiana na wartość true , gdy czujnik geolokalizacji jest niedostępny. Obiekt Geolocation wywołuje zdarzenie status , gdy właściwość muted zostanie zmieniona. Poniższy kod przedstawia sposób wykrywania niedostępności danych geolokalizacji:

package 
{ 
    import flash.display.Sprite; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 
    import flash.events.GeolocationEvent; 
    import flash.events.MouseEvent; 
    import flash.events.StatusEvent; 
    import flash.sensors.Geolocation; 
    import flash.text.TextField; 
    import flash.text.TextFormat; 
 
    public class GeolocationTest extends Sprite 
    { 
         
        private var geo:Geolocation; 
        private var log:TextField; 
         
        public function GeolocationTest() 
        {             
            super(); 
            stage.align = StageAlign.TOP_LEFT; 
            stage.scaleMode = StageScaleMode.NO_SCALE; 
            setUpTextField(); 
             
            if (Geolocation.isSupported) 
            { 
                geo = new Geolocation(); 
                if (!geo.muted) 
                { 
                    geo.addEventListener(GeolocationEvent.UPDATE, geoUpdateHandler); 
                } 
                geo.addEventListener(StatusEvent.STATUS, geoStatusHandler); 
            } 
            else 
            { 
                log.text = "Geolocation not supported"; 
            } 
        } 
         
        public function geoUpdateHandler(event:GeolocationEvent):void 
        { 
            log.text = "latitude : " + event.latitude.toString() + "\n"; 
            log.appendText("longitude : " + event.longitude.toString() + "\n"); 
        } 
         
        public function geoStatusHandler(event:StatusEvent):void 
        { 
            if (geo.muted) 
                geo.removeEventListener(GeolocationEvent.UPDATE, geoUpdateHandler); 
            else 
                geo.addEventListener(GeolocationEvent.UPDATE, geoStatusHandler); 
        } 
         
        private function setUpTextField():void 
        { 
            log = new TextField(); 
            var format:TextFormat = new TextFormat("_sans", 24); 
            log.defaultTextFormat = format; 
            log.border = true; 
            log.wordWrap = true; 
            log.multiline = true; 
            log.x = 10; 
            log.y = 10; 
            log.height = stage.stageHeight - 20; 
            log.width = stage.stageWidth - 20; 
            log.addEventListener(MouseEvent.CLICK, clearLog); 
            addChild(log); 
        } 
        private function clearLog(event:MouseEvent):void 
        { 
            log.text = ""; 
        } 
    } 
}
Uwaga: Telefony iPhone pierwszej generacji, które nie są wyposażone w układ GPS, wywołują zdarzenia update tylko w nielicznych sytuacjach. W tych urządzeniach obiekt Geolocation początkowo wywołuje jedno lub dwa zdarzenia update . Następne zdarzenia update są wywoływane tylko po istotnej zmianie informacji.

Sprawdzanie dostępności obsługi funkcji geolokalizacji

Aby sprawdzić, czy środowisko wykonawcze umożliwia korzystanie z tej funkcji, należy użyć właściwości Geolocation.isSupported .

if (Geolocation.isSupported) 
{ 
    // Set up geolocation event listeners and code. 
}

Aktualnie funkcja geolokalizacji jest obsługiwana tylko w aplikacjach opartych na kodzie ActionScript dla telefonu iPhone oraz w programie Flash Lite 4. Jeżeli w czasie wykonywania właściwość Geolocation.isSupported ma wartość true , oznacza to, że obsługa geolokalizacji jest dostępna.

Niektóre modele telefonu iPhone nie są wyposażone w moduł GPS. W tych modelach wykorzystywane są inne metody (np. triangulacja telefonu komórkowego) do uzyskania danych geolokalizacji. W takich modelach (lub innych telefonach iPhone niewyposażonych w moduł GPS) obiekt Geolocation może wywoływać tylko jedno lub dwa wstępne zdarzenia update .