Android編程之實現GPS定位

來源:互聯網
上載者:User

轉自:http://www.hzhike.com/School/2011/201106/20110602225053.html

 

 

本文協助讀者理解如何使用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的例子。

public class LocateMe extends Activity

{

public void onCreate(Bundle params)

{

super.onCreate(params);

setContentView(R.layout.main);

}

public boolean onKeyDown(int keyCode, KeyEvent event)

{

return true;

}

}

三 View類

View類是Android的一個超類,這個類幾乎包含了所有的螢幕類型。但它們之間有一些不同。每一個view都有一個用於繪畫的畫布。這個畫布可以用來進行任意擴充。本文為了方便起見,只涉及到了兩個主要的View類型:定義View和Android的XML內容View。在上面的代碼中,使用的是 “Hello World” XML View,它是以非常自然的方式開始的。

如果我們查看一下新的Android工程,就會發現一個叫main.xml的檔案。在這個檔案中,通過一個簡單的XML檔案,描述了一個螢幕的布局。這個 簡單的xml檔案的內容如下:

< ?xml version="1.0" encoding="utf-8"?>

< xmlns:android="http://schemas.android.com/apk/res/android">

androidrientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

< TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_centerHoriz

android:text="ress the center key to locate yourself"

/>

< /RelativeLayout>

上面的內容的功能看起來非常明顯。這個特殊檔案定義了一個相關的布局,這就意味著通過一個元素到另一個元素的關係或是它們父元素的關係來描述。對於視圖來 說,有一些用於布局的方法,但是在本文中只關注於上述的xml檔案。

RealtiveLayout中包含了一個填充整個螢幕的文字框(也就是我們的LocateMe activity)。這個LocateMe activity在預設情況下是全屏的,因此,文字框將繼承這個屬性,並且文字框將在螢幕的左上方顯示。另外,必須為這個XML檔案設定一個引用數,以便 Android可以在原始碼中找到它。在預設情況下,這些引用數被儲存在R.java中,代碼如下:

public final class R

{

public static final class layout

{

public static final int main=0x7f030001;

}

}

視圖也可以被嵌套,但和J2ME不同,我們可以將定製的視圖和Android團隊發布的Widgets一起使用。在J2ME中,開發人員被迫選擇 GameCanvas和J2ME應用程式畫布。這就意味著如果我們想要一個定製的效果,就必須在GameCanvas上重新設計我們所有的widget。 Android還不僅僅是這些,檢視類型也可以混合使用。Android還帶了一個 widget庫,這個類庫包括了捲軸,文本實體,進度條以及其他很多控制項。這些標準的widget可以被重載或被按著我們的習慣定製。現在讓我們來進入我們的例子。

四、Android執行個體

這個示範應用程式將示範了使用者的當前的經度和緯度(在文字框中顯示)。onCreate構造方法將和上面的例子基本相同,除了在其中加入了鍵盤處理,現在 讓我們看一下onKeyDown的代碼。

public boolean onKeyDown(int keyCode, KeyEvent event)

{

if(keyCode != KeyEvent.KEYCODE_DPAD_CENTER || m_bLoading)

{

return true;

}

m_bLoading = true;

getLocation();

return true;

}

下面讓我們來解釋一下這段代碼,首先,這段代碼檢查了當前被按下的鍵,但還沒有開始處理。而是在getLocation方法中處理這一切的。然後,將裝載 flag標誌以及調用getLocation方法,下面是getLocation方法的代碼。

private void getLocation()

{

Location loc;

LocationManager locMan;

LocationProvider locPro;

List proList;

setContentView(R.layout.laoding);

locMan = (LocationManager) getSystemService(LOCATION_SERVICE);

proList = locMan.getProviders();

locPro = proList.get(0);

loc = locMan.getCurrentLocation(locPro.getName());

Lat = (float)loc.getLatitude();

Lon = (float)loc.getLongitude();

CreateView();

setContentView(customView);

}

到這為止,程式開始變得更有趣了。但是不幸的是,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方法列出了上面看到的內容。

public void CreateView()

{

customView = new CustomView(this);

}

這個方法簡單地調用了CustomView對象的構造方法。CustomView類的定義如下:

public class CustomView extends View

{

LocateMe overlord;

public CustomView(LocateMe pCtx)

{

super(pCtx);

overlord = pCtx;

}

public void onDraw(Canvas cvs)

{

Paint p = new Paint();

String sLat = "Latitude: " + overlord.getLat();

String sLon = "Longitude: " + overlord.getLon();

cvs.drawText(sLat , 32, 32, p);

cvs.drawText(sLon, 32, 44, p);

}

}

這個定製的Android視圖獲得了經度和違度的測試資料,並將這些資料顯示在螢幕上。這要求一個指向LocateMe的指標,Activity類是整個應用程式的核心。它的兩個方法是構造方法和onDraw方法。這個構造方法調用了超類的構造方法以及引起了Activity指標的中斷。onDraw方法將建立一個新的Paint對象(這個對象封裝了顏色、透明度以及其他的主題資訊),這個對象將會訪問顏色主題。在本程式中,安裝了用於顯示的字串,並使用畫布指標將它們畫到螢幕上。這個和我們瞭解的J2ME遊戲的畫布看起來非常類似。

六、Android展望

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.