偵測地理位置變更

若要使用地理位置感應器,請初始化 Geolocation 物件,並註冊它所傳送的 update 事件。 update 事件是 Geolocation 事件物件。這個事件有八個屬性:

  • altitude :高度 (以公尺為單位)。

  • heading :移動方向 (以正北方作為基準,以角度為單位)。

  • horizontalAccuracy :水平精確度 (以公尺為單位)

  • latitude :緯度 (以角度為單位)。

  • longitude :經度 ( 以角度為單位)。

  • speed :速度 (每秒公尺數)。

  • timestamp :從執行階段初始化之後,事件時間的毫秒數。

  • verticalAccuracy :垂直精確度 (以公尺為單位)。

timestamp 屬性是 int 物件。其他則是 Number 物件。

以下是在文字欄位中顯示地理位置資料的基本範例:

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() 
}

若要使用這個範例,請確認建立 geoTextField 文字欄位,並先將它新增至顯示清單,再使用這個程式碼。

您可以呼叫 Geolocation 物件的 setRequestedUpdateInterval() 方法,調整地理位置事件的預定時間間隔。這個方法接受一個參數 ( interval ),而這個參數是要求的更新間隔 (毫秒):

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

地理位置更新之間的實際時間可能大於或小於這個值。在更新間隔中所做的任何變更會影響所有註冊的偵聽程式。 如果您未呼叫 setRequestedUpdateInterval() 方法,則應用程式會根據裝置的預設間隔來接收更新。

使用者可以防止應用程式存取地理位置資料。例如,應用程式嘗試取得地理位置資料時,iPhone 會提示使用者。回應提示時,使用者可以拒絕應用程式存取地理位置資料。使用者不允許存取地理位置資料時,Geolocation 物件會傳送 status 事件。此外,Geolocation 物件具有 muted 屬性。地理位置感應器無法使用時,此屬性會設為 true 。Geolocation 物件會在 muted 屬性變更時傳送 status 事件。下列程式碼顯示如何偵測地理位置資料無法使用的時機:

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 = ""; 
        } 
    } 
}
備註: 第一代 iPhone (不含 GPS 裝置) 只會偶爾傳送 update 事件。在這些裝置上,Geolocation 物件一開始會傳送一個或兩個 update 事件。然後在資訊大幅變更時傳送 update 事件。

檢查地理位置支援

使用 Geolocation.isSupported 屬性測試執行階段環境是否可以使用這個功能:

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

目前,只有針對 iPhone 的 ActionScript 型應用程式和 Flash Lite 4 支援地理位置。如果 Geolocation.isSupported 在執行階段是 true ,則支援地理位置。

部分 iPhone 機型沒有 GPS 裝置。這些機型使用其他方法 (例如行動電話三角定位) 取得地理位置資料。在這些機型中,或任何已停用 GPS 的 iPhone 上,Geolocation 物件可能只會傳送一個或兩個初始 update 事件。