谷歌Proximity Alerts教程

gagayu發表於2014-06-13

智慧手機正在逐漸統治整個手機世界,這是一個顯而易見的事實。自從GPS裝置被普遍的內嵌到智慧手機中,它給那些利用地理定位的應用程式提供了極大的幫助。 其中一類程式是採用基於定位的服務(Location Based Service),它是利用資料來計算使用者所在位置的。程式通常用的技術是geocoding(從地理資料中尋找相關的地理座標,如一條街的位置)和reverse geocoding(根據提供的座標來提供資訊)。另一類程式則採用Proximity Alerts。像它的名字那樣,當使用者的位置接近某個特定的Point of Interest(POI)時會進行提示。隨著大量的程式打算應用這項技術,並伴有宣傳精彩的示例,Proximity alert將會是接下來幾年的熱點。在這個教程中,我將展示怎樣去利用Android的內嵌Proximity alert功能。

在開始之前,簡單的瞭解一下基於定位的程式或geocoding會對接下來的閱讀帶來極大的幫助。你可能需要要讀一下我之前的幾篇教程,如 “Android Location Based Services Application – GPS location”和“Android Reverse Geocoding with Yahoo API – PlaceFinder”。另一個需要提醒的是,這篇教程是受“Developing Proximity Alerts for Mobile Applications using the Android Platform”這篇文章啟發而生。 這篇文章分為四個部分,對於初學者一些地方可能會稍顯複雜並帶來一些困難。基於這些原因,我決定寫一篇相對更短更易懂的教程。

我們將會建立一個簡單的程式,它儲存的一個點座標會被使用者觸發並且當使用者接近這個點推送訊息。 當使用者到達那個點座標時會根據需求獲取訊息。

我們首先建立一個Eclipse專案開始,並命名為“AndroidProximityAlertProject”。接下來,為程式建立一個Main Activity然後命名為ProxAlertActivity。 下面是程式的主頁面:

01-main-ui01-main-ui

這裡是UI介面的佈局,命名為main.xml

現在我們開始做一些有意思的東西。首先,我們需要一個到LocationManager class的引用,提供系統的位置服務。你可以通過getSystemService方法從activity中獲得。然後,(如果使用者的位置發生改變)可以通過requestLocationUpdates方法來獲得通知。在開發Proximity Alerts的時候,這並不是必須的要求,但是在這裡我需要用它計算POI和使用者位置之間的距離。在我們的示例中,裝置在任何時候都可以呼叫getLastKnownLocation方法獲取某個指定提供者的最後位置。最後,我們會用到addProximityAlert方法設定一個proximity alert。它可以指定你想要座標(緯度、經度)和半徑。 如果我們想要在一段特定的時間監視某個alert,還可以給那個alert設定過期時間。我們還可以提供PendingIntent,當裝置進入或者離開一個監測到的alert區域時發出intent。

示例程式碼如下:

在onCreate方法中,我們用了location manager並加入一個自定義類,它實現了LocatioListener介面。可以讓我們通過onLocationChanged方法得到位置變換的通知。接下來,看一下怎樣去處理更新。我們會使用不同的UI控制元件給按鈕新增onClickListeners。

當使用者想要得到目前的座標時,populateCoordinatesFromLastKnownLocation方法會被呼叫。在方法內部,使用getLastKnownLocation方法來得到Location物件,位置資訊將會被填充到EditText控制元件。

同樣的,當位置資訊第一次被獲取時,使用者想要儲存座標並向saveProxityAlertPoint提供alert(新增POI)。我們可以將經度和緯度以preference data的方式用SharedPreferences類來儲存下來,詳情請見SharedPreferences.Editor。最後,我們通過getBrodcast靜態方法來建立一個PendingIntent。對於這種封裝過的intent,我們建立一個intentFilter並使用registerReceiver方法來繫結一個自定義BroadcastReceiver和intentfiler。需要提醒的是,這種繫結還可以通過manifest來實現。

現在,我們來看一下如何來處理使用者位置變化。在實現介面的MyLocationListener類裡,我們從SharedPreference裡獲取儲存的位置資訊(retrievelocationFromPreferences)。然後,通過distranceTo方法計算兩個位置(POI和現在位置)的距離。通過這個計算,我們才會知道是否真正進入了某個區域。

第一步,處理進入POI事件。 可以通過繼承BroadcastReceiver的類(ProximityIntentReceiver)來實現。當proximity alert被觸發,會返回一個自定義intent(之前繫結的locationManager)。處理過程發生在onReceive方法裡,它會被事件(進出POI區域)呼叫。在方法內部,我們從相關intent獲取KEY_PROXIMITY_ENTERING key(用來定義proximity alert型別是進入-true,還是離開-false))。

示例程式碼如下:

程式碼簡潔明瞭。當我們定義了一個進入或離開的proximity alert,就可以提供一個自定義的推送了。要實現它,首先需要引用一個合適的Service,比如NotificationMananger。通過這個Service,我們傳送通知給使用者,並封裝合適的推送物件。推送的方式是可定製的,如包括震動或者閃光燈等。我們還可以新增特定的圖示在狀態列顯示。如果只是簡單新增標題和資訊,適合呼叫setLastestEventInfo方法。 你可以在這裡檢視關於notification的詳細內容。除此之外,我們可以通過PendingIntent來引導Activity進行下意識地點選推送。 為了讓程式碼更通俗易懂,這裡我就不這樣做了。

我們最後得到的manifest程式碼如下:

別忘了,新增相應的Permission到Manifest裡:

現在可以測試我們的程式了。啟動Eclipse配置,然後跳轉到DDMS介面檢視Emulation Control標籤,可以發現一個Location Controls選項。它可以給模擬器傳送模擬的位置資料。在Manual標籤裡,點選Send按鈕,這樣就能生成一些座標。

02-location-controls

在此之後,GPS提供者將會知道最後一次請求的已知位置。所以,點選“find Coordinates”按鈕你將會得到:

03-coordinates

點選“Save Point”來宣告當前位置為POI。 當前位置座標會被儲存到SharedPreference並且Proximity Alert會被新增到location manager中。

接下來,讓我們模擬使用者接近指定位置的事件。我們會更改座標值,例如更改維度(從37.422006到37.522006)。現在我們離的POI很遠。現在我們假裝我們正在接近它,所以把座標改的近一點(從37,52206到37.423006)。

04-point-approached

當兩點之間的半徑達到預警要求(之前設定為1000米)時會得到提示。這時,建立並通過notification manager推送訊息。推送的訊息如下:

05-notification

好了,大功告成。本文通過一個簡單的示例介紹瞭如何使用Android Platform來實施Proximity alerts。你可以從這裡下載示例專案的Eclipse專案程式碼。

相關文章