Android編程之實現GPS定位

Android編程之實現GPS定位

開發手機聯盟推出自己的Android手機雛形時,受到了極大的追捧。但是到現在還沒有真機在市場上銷售,Google爲了鼓勵開發人員來開發Android手機的應用程序,提供了1千萬美金來獎勵那些在Android開發中的獲獎者。當然,本文並不是告訴讀者如何去贏得大獎,而是幫助讀者理解如何使用Android SDK來開發Android程序,其中包括如何使用XML佈局來顯示廣西,從GPS組件中獲得設備的位置等,在本文的最後將學習如何將文本顯示在一個定製的視圖上。

    一、準備工作

    要想開發Android程序,我們需要如下三種軟件
    1. Eclipse
    2. Android SDK
    3. 開發Android程序的Eclipse 插件


    爲了開始我們的工作,首先要安裝Eclipse,然後從Google的網站獲得Android SDK,並且安裝Eclipse插件。

    二、Activity類

    每一種移動開發環境都有自己的基類。如J2ME應用程序的基類是midlets,BREW的基類是applets,而Android程序的基類是 Activity。這個activity爲我們提供了對移動操作系統的基本功能和事件的訪問。這個類包含了基本的構造方法,鍵盤處理,掛起來恢復功能,以及其他底層的手持設備的訪問。實質上,我們的應用程序將是一個Activity類的擴展。在本文中讀者將會通過例子學習到如何使用Activity類來編寫Android程序。下面是一個簡單的繼承Activity的例子。 引用:
  1. public class LocateMe extends Activity
  2. {
  3. public void onCreate(Bundle params)
  4. {
  5. super.onCreate(params);
  6. setContentView(R.layout.main);
  7. }
  8. public boolean onKeyDown(int keyCode, KeyEvent event)
  9. {
  10. return true;
  11. }
複製代碼
在上面程序中的onCreate方法將在應用程序第一次開始時調用。Bundle對象包含了任何用於建立參數或環境數據所需要的基本信息。 Activity可以是全屏的,或是懸浮的。它們可以是嵌套的,但是每一部分基本是獨立的。那麼,也許有人會問,setContentView是做什麼的呢?

三 View類

    View類是Android的一個超類,這個類幾乎包含了所有的屏幕類型。但它們之間有一些不同。每一個view都有一個用於繪畫的畫布。這個畫布可以用來進行任意擴展。本文爲了方便起見,只涉及到了兩個主要的View類型:定義View和Android的XML內容View。在上面的代碼中,使用的是 “Hello World” XML View,它是以非常自然的方式開始的。
    如果我們查看一下新的Android工程,就會發現一個叫main.xml的文件。在這個文件中,通過一個簡單的XML文件,描述了一個屏幕的佈局。這個簡單的xml文件的內容如下: 引用:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent"
  6.     >
  7. <TextView
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:layout_centerHorizontal="true"
  11.     android:text="Press the center key to locate yourself"
  12.     />
  13. </RelativeLayout>
複製代碼
上面的內容的功能看起來非常明顯。這個特殊文件定義了一個相關的佈局,這就意味着通過一個元素到另一個元素的關係或是它們父元素的關係來描述。對於視圖來說,有一些用於佈局的方法,但是在本文中只關注於上述的xml文件。
    RealtiveLayout中包含了一個填充整個屏幕的文本框(也就是我們的LocateMe activity)。這個LocateMe activity在默認情況下是全屏的,因此,文本框將繼承這個屬性,並且文本框將在屏幕的左上角顯示。另外,必須爲這個XML文件設置一個引用數,以便 Android可以在源代碼中找到它。在默認情況下,這些引用數被保存在R.java中,代碼如下: 引用:
  1. public final class R
  2. {
  3. public static final class layout
  4. {
  5. public static final int main=0x7f030001;
  6. }
  7. }
複製代碼
視圖也可以被嵌套,但和J2ME不同,我們可以將定製的視圖和Android團隊發佈的Widgets一起使用。在J2ME中,開發人員被迫選擇 GameCanvas和J2ME應用程序畫布。這就意味着如果我們想要一個定製的效果,就必須在GameCanvas上重新設計我們所有的widget。 Android還不僅僅是這些,視圖類型也可以混合使用。Android還帶了一個widget庫,這個類庫包括了滾動條,文本實體,進度條以及其他很多控件。這些標準的widget可以被重載或被按着我們的習慣定製。現在讓我們來進入我們的例子。

  四、Android實例
    這個演示應用程序將演示了用戶的當前的經度和緯度(在文本框中顯示)。onCreate構造方法將和上面的例子基本相同,除了在其中加入了鍵盤處理,現在讓我們看一下onKeyDown的代碼。 引用:
  1. public boolean onKeyDown(int keyCode, KeyEvent event)
  2. {
  3. if(keyCode != KeyEvent.KEYCODE_DPAD_CENTER || m_bLoading)
  4. {
  5. return true;
  6. }
  7. m_bLoading = true;
  8. getLocation();
  9. return true;
  10. }
複製代碼
下面讓我們來解釋一下這段代碼,首先,這段代碼檢查了當前被按下的鍵,但還沒有開始處理。而是在getLocation方法中處理這一切的。然後,將裝載flag標誌以及調用getLocation方法,下面是getLocation方法的代碼。
  1. private void getLocation()
  2. {
  3. Location loc;
  4. LocationManager locMan;
  5. LocationProvider locPro;
  6. List<LocationProvider> proList;
  7. setContentView(R.layout.laoding);
  8. locMan = (LocationManager) getSystemService(LOCATION_SERVICE);
  9. proList = locMan.getProviders();
  10. locPro = proList.get(0);
  11. loc = locMan.getCurrentLocation(locPro.getName());
  12. Lat =  (float)loc.getLatitude();
  13. Lon =  (float)loc.getLongitude();
  14. CreateView();
  15. setContentView(customView);
  16. }
複製代碼
到這爲止,程序開始變得更有趣了。但是不幸的是,Google關於之方面的文檔還是比較少了。在程序的變量聲明之後,我們需要演示一些裝載信息。 R.layout.loading符合了另一個簡單的XML佈局視圖。通過簡單地調用setContentView方法可以使用轉載信息重繪屏幕。
    讀者要注意的是:在編譯時,Android會預先將所有的XML佈局數據包裝起來。如果我們想在編譯後變化佈局屬性,按着規定,我們必須在源程序中做這些事。
     獲得LocationManager的唯一方法是通過getSystemService()方法的調用。通過使用LocationManager,我們可以獲得一個位置提供者的列表。在一個真實的手持設備中,這個列表包含了一些GPS服務。實際上,我們希望選擇更強大,更精確,最後不帶有其他附加服務的 GPS。現在,在模擬器中提供了一個用於測試的GPS,這個GPS來自San Francisco。定製的GPS文件可以可以被上傳,並進行測試。如果我們要測試更復雜的應用,來自San Francisco的GPS可能並不適合。
    目前我們可以使用位置管理器和位置提供者進行getCurrentLocation的調用。這個方法返回本機的當前位置的一個快照,這個快照將以 Location對象形式提供。在手持設備中,我們可以獲得當前位置的經度和緯度。現在,使用這個虛擬的手持設備,我們可以獲得這個例子程序的最終結果:建立了顯示一個定製的視圖。

五、使用定製視圖

    在最簡單的窗體中,一個Android中的視圖僅僅需要重載一個onDraw方法。定製視圖可以是複雜的3D實現或是非常簡單的文本形式。下面的CreateView方法列出了上面看到的內容。 引用:
  1. public void CreateView()
  2. {
  3. customView = new CustomView(this);
  4. }
複製代碼
這個方法簡單地調用了CustomView對象的構造方法。CustomView類的定義如下: 引用:
  1. public class CustomView extends View
  2. {
  3. LocateMe overlord;
  4. public CustomView(LocateMe pCtx)
  5. {
  6. super(pCtx);
  7. overlord = pCtx;
  8. }
  9. public void onDraw(Canvas cvs)
  10. {
  11. Paint p = new Paint();
  12. String sLat = "Latitude: " + overlord.getLat();
  13. String sLon = "Longitude: " + overlord.getLon();
  14. cvs.drawText(sLat , 32, 32, p);
  15. cvs.drawText(sLon, 32, 44, p);
  16. }
  17. }
複製代碼
這個定製的Android視圖獲得了經度和違度的測試數據,並將這些數據顯示在屏幕上。這要求一個指向LocateMe的指針,Activity類是整個應用程序的核心。它的兩個方法是構造方法和onDraw方法。這個構造方法調用了超類的構造方法以及引起了Activity指針的中斷。onDraw方法將建立一個新的Paint對象(這個對象封裝了顏色、透明度以及其他的主題信息),這個對象將會訪問顏色主題。在本程序中,安裝了用於顯示的字符串,並使用畫布指針將它們畫到屏幕上。這個和我們瞭解的J2ME遊戲的畫布看起來非常類似。

    六、Android展望

    從純粹的開發觀點看,Android是一個非常強大的SDK。它使用基於XML的佈局和定製視圖聯合了起來。並可以使用滾動條、地圖以及其他的組件。所以的這一切都可以被重載,或由開發人員來定製。但它所提供的文檔非常粗糙。在文檔中並沒有象SMS等技術,但是從整體上來看Android SDK,還是非常有希望的。也非常符合Google承諾的“First Look”SDK。現在我們要做的就是等待Google發佈第一個基於Android的手機,並使用它。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章