利用Java 編寫手機應用程式(轉)
來源:互聯網
上載者:User
程式 █前言
本文內容的所有操作皆在Windows 200作業系統上經過測試。如果您在不同的平台上驗證本文內容,例如Windows 98或是Windows Me,則我們無法保證會有相同的結果。
█簡介
不知從什么時候開始,我們突然感覺到周圍的人各各擁有一隻手機。利用手機與別人溝通成了我們生活的一部份。北歐某些先進國家的人民可以利用手機購買自動售貨機所出售的商品;他們也可以在從事行動商務(m-commence) 交易時利用手機做為一種認證工具。在日本,行動電話的許多附加功能更是年輕人文化的一部分。即將來臨的3G,無線寬頻的美夢帶給了人們對無線通訊未來的期待。
然後,有些廠商開始行銷它們自己生產的PDA,好象沒有一台PDA在手,就不像現代人似的。各式各樣的PDA充斥市面,暢銷的與不暢銷的,讓人眼花撩亂。這時產生了一個大問題--要我們同時攜帶手機和PDA是一件很麻煩的事情-就算它們都還算輕薄短小。如果可以把手機和PDA合而為一豈不是更方便嗎? 於是聽到消費者心聲的廠商,開始有推出手機和PDA合而為一的產品,從NOKIA 9000、Motorola A6188(太極),到最近要推出的Ericsson R380、NOKIA 9210,都是手機與PDA結合的例子,雖然因為售價的關係,但是這些產品仍然是許多人夢寐以求的高階產品。
儘管有了PDA與手機結合的產品出現,我們仍然覺得有所不足,我想大家一定發現了,就是應用程式的不足,雖然手機和PDA 結合了,可是這些產品上的PDA功能看起來似乎是死的。我們可以任意在PalmOS、Windows CE、EPOC等PDA上使用C/C++或是Java編寫這些平台上的應用程式,但是卻從未有過機會將我們寫好的程式下載到這些手機上執行(即使有些手機的PDA也是使用EPOC,如Ericsson R380)。
相信廠商也聽到我們這些喜歡到處寫程式的工程師的心聲了,所以從2000年年底開始,即將陸陸續續有許多支援Java的手機即將推出,當然,這些廠商也提供了在手機上開發程式的SDK,我們終於可以在手機上面寫些小程式自娛了!這是以前等了很久的美夢。
手機平台的多樣性與複雜性,和PDA比較起來可以說是有過之而無不及,於是大家就可以知道 - 哈!又是Java派上用場的時候了。我們都知道在瀏覽器上執行的Java程式叫做Applet,在PalmOS上執行的Java程式叫做Spotlet,然而在手機上執行的應用程式我們稱做MIDlet,相信對大家來說都是一個陌生的名詞,這也就是本篇文章所要介紹的主角。
支援Java的手機大廠目前已知有NOKIA (預計在2001年年初推出一款支援Java的手機NOKIA 9210)、Motorola(會先在支援integrated Digital enhanced network(iDen)網路的手機上支援Java,然後再推出支援Java的GSM手機,該公司的手機大致會在2002年前全部支援Java)以及NTT DoCoMo(將在明年第二季度左右推出支援Java的手機)。
雖然這些大公司都準備支援Java,不過在決定編寫本文時,只有Motorola將其SDK開放於網站上供程式開發人員下載測試,所以本文內容都是根據Motorola J2ME SDK所編寫。又由於這些手機市面上無法取得,所以我們的程式都是在SDK內附的模擬器中執行,相信最後這些手機上市時,我們所編寫的MIDlet應該會很容易並成功地在Motorola的手機上執行才對。
█如何取得Motorola J2ME SDK
我們要做的第一件事情當然還是要先取得SDK羅!
請直接到https://commerce.motorola.com/idenonline/ideveloper/下載Motorola J2ME SDK Drop 7。如果您不是iDEN® Developer的會員,請先在網路上註冊(免費)。註冊成功之後,Motorola會將密碼寄到您的email信箱之中,然後使用該密碼登入網頁上的My Development Center。進入之後選擇網頁上頭的TOOLS & RESOURCES以進入可下載的開發工具的網頁,請選擇Motorola J2ME SDK Components Developer Edition, Drop 7.0下方的下載超連結以下載SDK,整個SDK的大小約為3 MB左右。
請注意下載前的Download Page for Motorola J2ME™ SDK安裝說明,裡頭會告訴你安裝密碼,請先行記下。稍後當您在您的電腦上安裝Motorola J2ME SDK的時候,會詢問您安裝密碼,所以請務必記下該密碼。
█Motorola J2ME SDK的安裝
安裝需求
根據官方需求,安裝Motorola J2ME SDK的基本配備為:
Pentium 100 MHz微處理器
64 MB RAM
Windows NT WorkStation 4.0配合Service Pack 3 / Win98
(本文是在Windows 2000 Professional中文版上測試)
約6 MB的硬碟空間
Java 2 SDK 1.2.2
(本文使用Java 2 SDK 1.3.0_01作測試)
安裝Motorola J2ME SDK
要安裝新版Motorola J2ME SDK之前,請先確認您已經將舊版的Motorola J2ME SDK完全刪除。您可以由控制台裡頭的 「新增/刪除程式」的功能刪除舊版Motorola J2ME SDK。之後再將舊版Motorola J2ME SDK安裝所在路徑清除即可。
解開您從Motorola網站上下載的ZIP檔案,您會看到一個名為Motorola_SDK.exe的檔案,雙擊此檔案即可開始安裝動作。請注意,在安裝時系統會要求您輸入密碼,請輸入之前所紀錄的安裝密碼即可。
█Motorola J2ME SDK目錄結構
當您成功地安裝Motorola J2ME SDK之後,其目錄結構如下圖:
█MIDlet程式結構
在手機上執行的程式我們統稱MIDlet,其程式結構很簡單,與大家熟悉的Applet結構有異曲同工之妙。
每一個MIDlet程式都必須繼承自javax.microedition.midlet.MIDlet類別,並實做三個函式,它們分別是:
protected void startApp()
protected void pauseApp()
protected void destroyApp(Boolean unconditional)
而一個MIDlet程式的起始與結束之流程我們以下圖來表示:
█編寫並編譯MIDlet
請先到您的Motorola J2ME SDK安裝目錄下的demo\midlets目錄底下建立一個名為HelloMIDlet.java的檔案,其內容為:
HelloMIDlet.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class HelloMIDlet extends MIDlet
{
HelloMIDlet()
{
}
protected void startApp() throws MIDletStateChangeException
{
}
protected void pauseApp()
{
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
}
在demo\midlets目錄之中您會看到一個名為compileAll.bat的批次檔,前面有提到,這個批次檔除了可以協助您編譯所有內附範常式序之外,還可以簡化您自己所編寫的MIDlet之編譯流程。
請在命令列視窗輸入: compileAll HelloMIDlet.java
如果成功編譯,螢幕上輸出的結果如下圖所示:
從螢幕上的輸出,您可以發現,要讓MIDlet可以在手機上執行,大體上還是要經過兩個動作(與Spotlet相似),分別是編譯(compiling)以及預先審核(Preverifying)。
有關預先審核這個動作,筆者已經在RUN!PC 11月號的文章「利用Java 編寫PalmOS應用程式基底礎篇」之中有向讀者們提過,如果對這個方面有所疑問的朋友,請再將您的RUN!PC 11月號翻出來複習一下吧!
從這個簡短的MIDlet製作流程裡頭,相信大家可以發現,比起純粹用Sun的CLDC編寫能在KVM上執行的Spotlet要簡單上許多。原因是compileAll.bat這個批次檔幫我們做掉大部分dirty work。
那么,如果您寫好的程式並非放在demo\midlets目錄之中,是否就無法編譯了? 從compileAll.bat裡頭,我們可以發現它幫我們完成上述兩項工作的指令。如果我們寫好的程式放在demo\midlets目錄以外的地方,您可以執行下面的指令,您仍然可以成功地製作MIDlet:
(我們假設您的Motorola J2ME SDK安裝在D:\MotoSDK目錄之中,並將您自行編寫的HelloMIDlet.java置於d:\jdk1.3.0_01\my目錄之中。同時我們假設您在d:\jdk1.3.0_01\my目錄底下執行下面指令。)
編譯:
javac -O -bootclasspath d:\MotoSDK\lib HelloMIDlet.java
注意: -bootclasspath指向類函數庫的所在位置。
預先審核:
d:\MotoSDK\bin\preverifier -classpath d:\MotoSDK\lib;. -d . HelloMIDlet
注意:
1 . -classpath指向類函數庫的所在位置,也要指向我們所編寫的MIDlet所在的位置。
2 .–d指向您希望預先編譯類檔案產生之後所放置的路徑,如果寫"."表示本目錄,會覆蓋掉原先未經過預先編譯的類檔案。如果您沒有指定,則預設值為".\output"目錄。
當然,如果您嫌自己手動操作很麻煩,您可以將compileAll.bat複製到其它目錄之中,並更改其編譯指令與預先審核指令之中和類函數庫有關的相關設定即可。
提到compileAll.bat,順便向各位讀者說明一下,在前面有提到,compileAll.bat可以協助您編譯所有位於demo\midlets目錄下的範常式序,您只要在命列列下直接輸入: compileAll即可。compileAll.bat會自動當您編譯的package有以下幾項:
com.mot.j2me.midlets.bounce
com.mot.j2me.midlets.imagetests
com.mot.j2me.midlets.paddleball
com.mot.j2me.midlets.scribble
com.mot.j2me.midlets.tests
com.mot.j2me.midlets.tutorials
如果您希望compileAll.bat自動幫您編譯其它package底下的程式,請您開啟compileAll.bat,修改其COMPILECLASS環境變數的設定即可。
█修改並執行MIDlet
寫好程式之後,大家最希望的事情當然就是讓它在手機上執行,不過由於目前大家無法取得Motorola這些支援Java的手機,所以我們只能在Motorola J2ME SDK內附的模擬器上執行我們寫好的MIDlet。相信手機正式推出時,應該可以順利地在手機上執行。底下筆者將告訴您如何使用Motorola J2ME SDK內附的模擬器來測試您所編寫的MIDlet。
在這之前,由於之前我們所編寫的範常式序只是簡單的MIDlet空殼,我們必須讓它能夠在模擬器上顯示出一些資訊才可以,因此請修改上一個程式範例,使它的內容如下:
HelloMIDlet.java
import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class HelloMIDlet extends MIDlet
{
private Display firstDisplay ;
private Form firstForm ;
HelloMIDlet()
{
firstDisplay = Display.getDisplay(this) ;
firstForm = new Form("Hello MIDlet") ;
StringItem firstStrItem = new StringItem("Hello","MIDlet") ;
firstForm.append(firstStrItem) ;
}
protected void startApp() throws MIDletStateChangeException
{
firstDisplay.setCurrent(firstForm) ;
}
protected void pauseApp()
{
}
protected void destroyApp(boolean unconditional)
throws MIDletStateChangeException
{
}
}
請將此檔案放置在\demo\midlets目錄下。編譯完成之後,請將目錄切換到scripts子目錄之中,您會在此目錄裡發現一些寫好的批次檔。請在該目錄下執行這些批次檔指令以啟動模擬器。執行的指令與執行結果如下所示:
指令: runEmul HelloMIDlet
輸出結果
指令: runMotoi1000 HelloMIDlet
輸出結果
指令: runMotoiDEN HelloMIDlet
輸出結果
指令: runStarTac HelloMIDlet
輸出結果
指令: runMyDevice HelloMIDlet
輸出結果
Error loading property file: C:/properties/mydevice.props (系統找不到指定的路徑。)會出現錯誤資訊是因為您沒有指定屬於是用者自訂的手機外觀的緣故,後面將會教您如何設定使用者自訂的手機外觀。
如果我們將寫好的程式放在demo\midlets目錄以外的地方,您可以執行下面的指令,仍然可以成功地啟動模擬器並執行MIDlet:
(我們假設您的Motorola J2ME SDK安裝在D:\MotoSDK目錄之中,並將您自行編寫的HelloMIDlet.java置於d:\jdk1.3.0_01\my目錄之中。同時我們假設您在d:\jdk1.3.0_01\my目錄底下執行下面指令。)
執行一般模擬器 java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:\MotoSDK\lib javax.microedition.midlet.AppManager HelloMIDlet
-JSA 1 1
請注意:
第一個-classpath設定,-classpath與路徑名稱之間有空格。
第二個-classpath設定,-classpath與路徑名稱之間沒有空格。
執行模擬器並套用i1000手機外觀
java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:\MotoSDK\lib
-deviceFile resources\Motorolai1000.props
javax.microedition.midlet.AppManager
HelloMIDlet
-JSA 1 1
請注意:
第一個-classpath設定,-classpath與路徑名稱之間有空格。
第二個-classpath設定,-classpath與路徑名稱之間沒有空格。
執行模擬器並套用iDEN手機外觀 java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:\MotoSDK\lib
-deviceFile resources\MotorolaiDENPlatform.props
javax.microedition.midlet.AppManager
HelloMIDlet
-JSA 1 1
請注意:
第一個-classpath設定,-classpath與路徑名稱之間有空格。
第二個-classpath設定,-classpath與路徑名稱之間沒有空格。
執行模擬器並套用StarTac手機外觀 java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:\MotoSDK\lib
-deviceFile resources\StarTac.props
javax.microedition.midlet.AppManager
HelloMIDlet
-JSA 1 1
請注意:
第一個-classpath設定,-classpath與路徑名稱之間有空格。
第二個-classpath設定,-classpath與路徑名稱之間沒有空格。
執行模擬器並套用使用者自訂手機外觀 java -Djava.library.path=d:\MotoSDK\lib
-classpath d:\MotoSDK\bin\Emulator.jar;d:\MotoSDK\bin\ConfigTool.jar com.mot.tools.j2me.emulator.Emulator
-classpath.;d:\MotoSDK\lib
-deviceFile <您的props檔案所在的絕對路徑>javax.microedition.midlet.AppManager
HelloMIDlet
-JSA 1 1
請注意:
第一個-classpath設定,-classpath與路徑名稱之間有空格。
第二個-classpath設定,-classpath與路徑名稱之間沒有空格。
如果您將您的props檔案放在d:\MotoSDK\bin的resources目錄之下,則上述指令只要改成:-deviceFile resources\<您的props檔案名稱>
注意,當您您直接使用上述指令啟動模擬器,如果出現底下錯誤資訊:
Error loading property file: resources/defaultdevice.props (系統找不到指定的路徑。)
這是因為您沒有將d:\MotoSDK\bin目錄下的resources子目錄複製到d:\JDK1.3.0_01\my目錄之下的緣故。