J2ME程序開發全方位基礎講解彙總

J2ME程序開發全方位基礎講解彙總

編輯:biexd    審覈:biexd    文章來源:mailbomb

關鍵詞:無    發表日期:2006-03-15 13:55:17    瀏覽次數:870

 

本文版權歸原作者,中國JAVA手機網收錄本文的目的是讓更多人閱讀到此文章。轉載請註明出處爲中國JAVA手機網<www.cnjm.net>

來自:http://www.cnjm.net/tech/article1192.html

[作者:mailbomb]

 

一、J2ME中需要的Java基礎知識

JAVA手機網[www.cnjm.net]      現在有大部分人,都是從零開始學J2ME的,學習J2ME的時候,總是從Java基礎開始學習,而且現在講Java基礎的書籍中都是以J2SE來講基礎,這就給學習造成了一些不必要的麻煩,下面將J2ME中用到的和不需要的Java基礎知識做一個簡單的說明。

JAVA手機網[www.cnjm.net]      J2ME中使用到的Java基礎知識:

    1Java語法基礎:包括基本數據類型、關鍵字、運算符等等

    2、面向對象的思想:類和對象的概念,繼承和多態等等。

    3、異常處理

    4、多線程

  J2ME中沒有用到的Java基礎知識:

    1JDKjavacjava命令的使用

    2Java基礎中的很多類在J2ME中沒有,或者類中的方法做了大量的精簡。所以建議在J2ME中熟悉類庫。

    3AppletAWTSwing這些知識在J2ME中根本使用不到。

  簡單說這麼多,希望學J2ME的朋友們能少走一些彎路,不足之處希望大家積極指正和補充。

 

二、J2ME中暫時無法完成的功能

JAVA手機網[www.cnjm.net]  列一些J2ME中暫時無法完成的功能,希望大家能積極補充:

    1、在手機中不更改代碼實現移植,主要指遊戲。

    2、動態修改按鈕文字。

    3、在Canvas上接受中文輸入。

    4、操作本地資源、例如地址本、已收短信息等。

    5、製作破壞性的手機病毒。

    6、其他等待大家來補充。

 

三、J2ME的跨平臺性

  J2ME技術源於Java,所以也具有JVM的優勢,可以在支持Java的平臺上進行移植,但是現在的J2ME技術在跨平臺上卻做的很糟糕,我們來簡單看一下原因:

  1、手機的屏幕尺寸不一:

  這個主要在界面製作上。如果你使用的是高級用戶界面,比如你做的是應用開發或者用戶登陸、用戶註冊這樣的通用功能時,一般沒有什麼問題。

JAVA手機網[www.cnjm.net]  如果你使用的是低級用戶界面,比如你做的是遊戲,那麼你就需要考慮這個問題了。

  2、廠商的擴展API不統一:

  例如Nokia的擴展API類庫UI系列,在別的手機上或者沒有實現,或者包名不同等等。

  3、手機平臺上實現的bug

  例如Nokia7650在實現雙緩衝上有bug,那麼在這種機型上運行的軟件就不能使用雙緩衝。其他NOKIA上的一些bug,可以參看:http://blog.csdn.net/Mailbomb/archive/2005/03/24/329123.aspx

JAVA手機網[www.cnjm.net]  4、手機性能問題。

  不同手機的可用內存、最大jar文件都有要求,例如Nokia S40的大部分手機支持的最大jar文件爲64K,最大可用內容爲210K

  所以現在的手機軟件,特別是遊戲都提供支持的機型列表,也纔有了手機遊戲移植人員的存在。

 

四、學習J2ME可以從事的工作種類

  現在J2ME技術可以說相當的火暴,這裏介紹一些學好了J2ME之後可以從事的工作的種類:

  1J2ME遊戲開發人員

  根據遊戲策劃或者文檔要求,在某種特定的機型(Nokia S40S60居多)開發遊戲程序。

  這是現在大部分J2ME程序員從事的工作。

  需要熟練掌握:高級用戶界面、低級用戶界面、線程,如果是網絡遊戲,還需要熟練網絡編程。

JAVA手機網[www.cnjm.net]  2J2ME應用開發人員

  現在的移動應用還不是很多,但是還是出現了一些,特別是移動定位以及移動商務相關的內容。

  需要熟練掌握:高級用戶界面、線程和網絡編程。

  3J2ME遊戲移植人員

  參照源代碼,將可以在一個平臺上可以運行的遊戲移植到其他平臺上去。例如將Nokia S40的遊戲移植到S60上,或者索愛的T618等等。

  主要是控制屏幕座標,有些可能需要替換一些API

  需要熟悉各平臺之間的差異以及相關的技術參數,比如屏幕大小、最大jar文件尺寸等等。

 

五、J2ME程序設計的幾個原則

  1、使用面向對象編程。

JAVA手機網[www.cnjm.net]  雖然使用面向過程編程可以減小文件的尺寸,但是爲了以後維護的方便和利於擴展,還是要使用面向對象編程。

  2、使用MVC模式

  將模型、界面和控制分離。現在很多的程序將三者合一,但是如果你做的程序比較大的話,還是建議你進行分離。

  3、自動存儲用戶設定

  使用RMS來存儲用戶的信息,例如存儲用戶上次輸入的用戶名、密碼、用戶對於系統的設定等,這樣不僅可以減少用戶的輸入,而且對用戶友好。很多程序甚至做了自動登陸等。

  4、一些系統設置允許用戶關閉。如背景音樂、背景燈顯示等。

  5、將低級用戶界面的繪製動作放在一個獨立的線程裏面去。

  6、在需要大量時間才能完成的工作時,給用戶一個等待界面。

 

六、從模擬器到真機測試

  對於J2ME開發者來說,模擬器給我們帶來了很多方便,比如可以在模擬器中調試程序以及很方便的察看程序的效果,但是模擬器也給我們帶來了一些問題,比如模擬器實現的bug等等,所以進行真機測試是必須的。

  1、爲什麼要進行真機測試?

  因爲模擬器程序可能存在bug,以及真機的性能有限,所以必須進行真機測試。

JAVA手機網[www.cnjm.net]  2、如何將程序傳輸到機器中?

  將程序傳輸到機器中有如下方式:

JAVA手機網[www.cnjm.net]    a) OTA下載

    b) 使用數據線傳輸

    c) 紅外傳輸

    d) 藍牙

  你可以根據條件,選擇合適的方式。

JAVA手機網[www.cnjm.net]  3 真機測試主要測什麼?

  真機測試的內容很多,主要測試以下幾個方面:

    a) 程序的功能

    b) 程序的操作性,是否易操作

    c) 程序的大小,比如Nokia S40系列的手機大部分接受的最大文件尺寸爲64K

    d) 程序運行速度,速度是否可以忍受。

 

七、從WTK到廠商SDK

JAVA手機網[www.cnjm.net]  對於J2ME愛好者來說,基本上大家都是從SUNWTK(J2ME Wireless Toolkit)開始的,但是對於實際應用來說,僅僅使用WTK是遠遠不夠的,所以在學習過程中,必須完成從WTKSDK的跨越。

  1、廠商SDK的下載地址?

  http://blog.csdn.net/Mailbomb/archive/2005/01/01/236606.aspx

  2、廠商SDKWTK有什麼不同?

  廠商SDK最簡單的理解就是在WTK的基礎上增加了自己的模擬器和自己的擴展API

  也就是說,你在使用廠商的SDK時,可以使用廠商的擴展類庫,例如NokiaUI類庫,和廠商自己的模擬器而已。

  每個廠商的擴展API都不多,而且不盡相同。

  3、如何使用?

  有些廠商SDK的使用都和WTK相同,例如SamSung

  Nokia提供了獨立的界面來開發,但是這個界面在實際開發中使用不多。

  4、廠商SDK的問題

JAVA手機網[www.cnjm.net]  廠商SDK實現過程中,有一些bug,而且和真機實現不一致。例如NOKIA的混音播放問題等等。

 

八、在J2ME中獲得手機IMEI的方法

  IMEIInternation mobile entity identification的簡稱,在手機中輸入*#06#可以顯示該數字,長度爲15位,全球唯一,永遠不會衝突,所以可以作爲識別用戶的一個標誌。

  下面是在J2ME中獲得IMEI的方法:

  1MOTO系列的手機可以通過讀取系統的IMEI屬性獲得,代碼如下:

             String imei = System.getProperty("IMEI");

JAVA手機網[www.cnjm.net]  2SIEMENS系列的手機可以通過讀取系統的com.siemens.IMEI屬性獲得,代碼如下:

             String imei = System.getProperty("com.siemens.IMEI");

 

九、J2ME網絡連接中顯示問題的解決辦法

JAVA手機網[www.cnjm.net]  在網絡編程中,有些時候會出現一些在沒有接收到網絡數據就顯示界面的,造成界面顯示不符合要求(例如公告顯示,會先顯示公告的背景圖片再顯示公告信息),這裏提一個簡單的解決辦法給大家:

  解決這種情況的方法分成三個步驟:

  1、在需要顯示的界面中,調用發送網絡數據的方法。每次顯示時調用該構造方法,不調用DisplaysetCurrent方法顯示。

  2、顯示等待界面(例如進度條等),給用戶提示,在進行網絡連接。

  3、在處理網絡反饋的數據完以後,調用DisplaysetCurrent方法顯示顯示當前界面。

 

十、增強J2MEString能力——分割字符串

  從JDK1.4以後,String類中新增了split方法來實現字符串的分割,但是在J2ME中卻沒有該方法(MIDP2.0中也沒有實現),但是在實際使用過程中,有些時候的確要用到這種操作,這裏將我以前實現的一段代碼和大家共享:

/**

* 分割字符串,原理:檢測字符串中的分割字符串,然後取子串

* @param original 需要分割的字符串

* @paran regex 分割字符串

* @return 分割後生成的字符串數組

*/

 

private static String[] split(String original,String regex)

{

JAVA手機網[www.cnjm.net]    //取子串的起始位置

    int startIndex = 0;

    //將結果數據先放入Vector

    Vector v = new Vector();

    //返回的結果字符串數組

    String[] str = null;

    //存儲取子串時起始位置

    int index = 0;

 

    //獲得匹配子串的位置

JAVA手機網[www.cnjm.net]    startIndex = original.indexOf(regex);

    //System.out.println("0" + startIndex);

    //如果起始字符串的位置小於字符串的長度,則證明沒有取到字符串末尾。

    //-1代表取到了末尾

    while(startIndex < original.length() && startIndex != -1)

    {

          String temp = original.substring(index,startIndex);

          System.out.println(" " + startIndex);

          //取子串

          v.addElement(temp);

 

          //設置取子串的起始位置

          index = startIndex + regex.length();

 

          //獲得匹配子串的位置

          startIndex = original.indexOf(regex,startIndex + regex.length());

    }

 

    //取結束的子串

    v.addElement(original.substring(index + 1 - regex.length()));

    //Vector對象轉換成數組

    str = new String[v.size()];

    for(int i=0;i

    {

         str[i] = (String)v.elementAt(i);

    }

   

    //返回生成的數組

    return str;

}

 

十一、J2ME在低級用戶界面上分行顯示文字

  在J2ME的低級用戶界面開發中,經常會遇到需要在Canvas上顯示大量的文字,例如關於界面、遊戲說明、遊戲公告等信息。如果在設計時,將文字的內容和長度都固定,既不利於修改也不利於維護。下面介紹一個簡單的方法,實現一個簡單、可維護性強的方式。

  實現方法:

    1、將需要顯示的所有信息做成一個字符串。

    2、編寫一個將該字符串按照要求轉換爲字符串數組的方法。

JAVA手機網[www.cnjm.net]    3、將轉換後的數組以循環的方式顯示在Canvas上。

  通過這樣三個步驟,則修改顯示的信息時,只需要修改包含顯示信息的字符串即可,自己書寫的方法可以按照以前的標準重新分割新的字符串。如果需要修改每行顯示的字符個數,則只需要修改自己書寫的方法即可。

JAVA手機網[www.cnjm.net]  通過這樣一種實現方式,可以很方便的實現顯示一些比較長的文本信息,即使是可變長度的字符串也沒有問題。

 

十二、J2ME中使用記錄存儲系統(RMS)存儲信息

  在MIDP中,沒有文件的概念,所以永久存儲一般只能依靠記錄存儲系統實現,關於記錄存儲系統的簡介,可以參看教程:http://www-900.ibm.com/developerWorks/cn/java/j-wi-rms/index.shtml

  下面是一些記錄存儲系統的常用編碼介紹:

    1、打開記錄集:

  打開記錄集使用RecordStore裏面的靜態方法openRecordStore,示例代碼如下:

         RecordStore rs = RecordStore.openRecordStore(“username”,true);

  這樣就打開了一個名稱爲rs的記錄集,其中username爲記錄集的名稱,該名稱可以根據需要來取,第二個參數代表是否則沒有時創建新的記錄集,true代表在該記錄集不存在時,創建新的記錄集,false代表不創建。

  如果在打開記錄集時,該記錄集不存在,則拋出RecordStoreNotFoundException異常,所以檢測記錄集是否已創建可以使用該異常。

  注意:記錄集打開以後記得關閉。

    2、向記錄集中寫入數據

        2.1增加數據

  向已經打開的記錄集中添加數據,需要使用addRecord方法,示例代碼:

                byte[] bytes = {1,2,3};

             int id = rs. addRecord(bytes,0,bytes.length);

  該代碼將字節數組bytes的全部內容寫入到記錄集中,該方法的返回值爲該信息的id,注意:id1開始,而不是從0開始。

  你可以循環使用該方法向記錄集中寫入多條數據。

        2.2修改數據

  修改已經存在的記錄集中指定id的數據,需要使用setRecord方法,示例代碼:

                byte[] bytes = {1,2,3};

             rs. setRecord(1,bytes,0,bytes.length);

  以上代碼的作用是將字節數組bytes的全部內容寫入到id1的記錄集rs中。

  該操作會覆蓋已有的數據。

  說明:有些時候,你需要將信息寫入到記錄集中的第一條記錄中,則可以結合以上兩個方法,則第一次時向記錄集增加數據,以後來進行修改。

    3、從記錄集中讀出數據

  從記錄集中讀取已有數據,需要使用getRecord方法,示例代碼:

           byte[] bytes = rs. getRecord(1);

  該代碼從記錄集rs中讀取第一條數據,將讀取到的數據放在bytes數組中。

  在讀取數據時,可以獲得記錄集中id的個數,可以使用getNumRecords方法獲得

  綜合代碼爲:

JAVA手機網[www.cnjm.net]      int number = rs. getNumRecords();

      int id = 1;

      if(id >0 && id < number)

      {

       byte[] bytes = rs. getRecord(1);

      }

    4、從記錄集中刪除記錄

  從記錄集中刪除記錄的方法有兩種:邏輯刪除和物理刪除。

  邏輯刪除是指給刪除的記錄打標記。

  物理刪除是指從物理上刪除該記錄,但是該記錄的id不能被重用,也就是說該id不會被繼續使用。例如一個記錄集中有5個記錄,假設你刪除了id3的數據,則剩餘記錄的id依然爲1245。這給便歷帶來了一定的麻煩。

    5、便歷記錄集

  便歷記錄集,即訪問記錄集中的所有數據,有兩個方法,詳見:

http://gceclub.sun.com.cn/NASApp/sme/controller/teclist?tid=0103

    6、其他操作

  刪除記錄集

  刪除記錄集不同於刪除記錄,需要使用deleteRecordStore方法,示例代碼:          

               RecordStore. deleteRecordStore(“username”);

JAVA手機網[www.cnjm.net]  該代碼刪除名稱爲username的記錄集。

 

JAVA手機網[www.cnjm.net]十三、J2ME加密數據的一個第三方開源免費類庫介紹

  在J2ME編程中,經常遇到一些數據在存儲或者傳輸時需要加密,下面介紹一個第三方的加密類庫的一些資料:

  加密類庫的官方主頁:http://www.bouncycastle.org/

  介紹的文章:

  中文:http://18900.motorola.com/ewa_portal/develope/jc_j2messl_5_1.jsp

  英文:http://www.javaworld.com/javaworld/jw-12-2002/jw-1220-wireless.html

  該文章的源代碼包含使用的一些方法。

  備註:因爲該類庫提供的功能比較強大,所以類庫的尺寸比較大,最後在發佈時需要將類庫中不需要的類刪除

 

十四、如何播放聲音

  在J2ME中,處理聲音需要使用到Mobile Media API(MMAPI),該包是MIDP1.0的可選包,在MIDP2.0中已經包含了這個包。所以如果你使用MIDP1.0的話,請確認你的運行環境是否支持。

  一般手機支持的聲音文件格式爲wavmidmpg等。具體請查閱你的手機說明文檔。

  在聲音處理中,有很多處理的方式,這裏說一下最常用的情況,播放JAR文件中的wav文件。

  播放聲音文件的流程:

    1、按照一定的格式讀取聲音文件。

  播放JAR文件中的聲音文件一般是將聲音文件處理成流的形式。示例代碼:

            InputStream is = this.getClass().getResourceAsStream("/Autorun.wav");

      其中Autorun.wav文件位於JAR文件的根目錄下,如果位於別的目錄,需要加上目錄名稱,如/res /Autorun.wav

JAVA手機網[www.cnjm.net]    2、將讀取到的內容傳遞給播放器。

  將流信息傳遞給播放器,播放器按照一定的格式來進行解碼操作,示例代碼:

            Player player = Manager.createPlayer(is,"audio/x-wav");

  其中第一個參數爲流對象,第二個參數爲聲音文件的格式。

    3、播放聲音。

  使用Player對象的start方法,可以將聲音播放出來,示例代碼:

            player.start()

  在播放聲音時也可以設定聲音播放的次數,可以使用Player類中的setLoopCount方法來實現,具體可查閱API文檔。

  下面是在NOKIA S60模擬器中測試通過。代碼如下:

package sound;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

import javax.microedition.media.*;

JAVA手機網[www.cnjm.net]import java.io.*;

JAVA手機網[www.cnjm.net]

public class SoundMIDlet extends MIDlet

{

  private Player player = null;

  /** Constructor */

  public SoundMIDlet()

      {

            try

            {

                  InputStream is = this.getClass().getResourceAsStream("/Autorun.wav");

JAVA手機網[www.cnjm.net]                  player = Manager.createPlayer(is,"audio/x-wav");

            }

            catch(IOException e)

JAVA手機網[www.cnjm.net]            {

                  System.out.println("1:" + e);

            }

JAVA手機網[www.cnjm.net]            catch(MediaException e)

            {

                  System.out.println("2:" + e);

            }

            catch(Exception e)

            {

                  System.out.println("3:" + e);

            }

     }

 

     /** Main method */

     public void startApp()

     {

            if(player != null)

            {

                  try

                  {

JAVA手機網[www.cnjm.net]              player.start();

                  }

                  catch(MediaException e)

JAVA手機網[www.cnjm.net]                  {

              System.out.println("4:" + e);

                  }

JAVA手機網[www.cnjm.net]            }

      }

 

      /** Handle pausing the MIDlet */

      public void pauseApp()

      {

JAVA手機網[www.cnjm.net]      }

 

JAVA手機網[www.cnjm.net]      /** Handle destroying the MIDlet */

      public void destroyApp(boolean unconditional)

      {

      }

}

 

JAVA手機網[www.cnjm.net]十五、J2ME 3D編程的一些資料

  隨着J2ME技術的發展,以及硬件速度的提升,3D遊戲程序將慢慢的變成主流,最近想學習這一塊的編程,所以收集了一些資料,和大家一起分享:

JAVA手機網[www.cnjm.net]  1JSR184

  JSR184Nokia公司起草的一個關於3D API的規範,下載地址爲:

JAVA手機網[www.cnjm.net]  http://www.forum.nokia.com/main/1,,1_0_10,00.html#jsr184

  2Nokia3D編程資料

  http://www.forum.nokia.com/main/1,6566,21,00.html

  33D引擎

  一個簡單的開放源代碼的3D遊戲引擎

  http://www.j2me.com.cn/Soft_Show.asp?SoftID=19

  國內一個合作開發3D引擎的項目:

  http://gceclub.sun.com.cn/NASApp/sme/jive/thread.jsp?forum=11&thread=8593

  4、一款3D遊戲產品

  http://games.sina.com.cn/newgames/2004/04/040217696.shtml

  5、支持3D的開發工具

  當前一些高端的手機支持3D開發,支持3D開發的開發工具中,通用的有SUNJ2MEWTK2.2。專用的是廠商提高的支持JSR184SDK

 

十六、3D編程——第一個3D程序

  參考WTK2.2提供的demo,完成了第一個3D程序,雖然很簡單,而且有些問題還不是很清楚,還是把代碼共享出來和願意學習J2ME 3D編程的朋友一起學習。

  關於代碼的編譯和運行說明如下:

  1、以下代碼在J2ME WTK2.2下面編譯通過。

  2、代碼分爲兩個文件:First3DCanvas.javaFirst3DMIDlet.java

  3、使用J2ME WTK2.2建立新的工程,主MIDlet類爲:first3d. First3DMIDlet

  4、將代碼保存在你的工程目錄下的first3d目錄下。

JAVA手機網[www.cnjm.net]  5、將J2ME WTK安裝目錄下的apps/Demo3D/res/com/superscape/m3g/wtksamples/retainedmode/content目錄中的swerve.m3g文件複製到你的工程目錄下的res目錄下。

  6、你的工程建立後,設置工程,通過WTK界面中的“設置”按鈕打開設置窗口,在“API選擇”中,設置“目標平臺”爲:自定義;“簡檔”爲“MIDP2.0”;“配置”爲“CLDC1.1”;選中“Mobile 3D Graphics for J2ME(JSR184)”。

  7、這樣你就可以編譯和運行以下代碼了。

  源代碼如下:

 

// First3DMIDlet.java

package first3d;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class First3DMIDlet extends MIDlet

{

     private First3DCanvas displayable = new First3DCanvas();

     public void startApp()

     {

JAVA手機網[www.cnjm.net]           Display.getDisplay(this).setCurrent(displayable);

     }

 

     public void pauseApp() {}

 

     public void destroyApp(boolean unconditional) {}

}

 

JAVA手機網[www.cnjm.net]// First3Dcanvas.java

package first3d;

import javax.microedition.lcdui.*;

import javax.microedition.m3g.*;

import java.util.*;

/**

* 第一個3D程序

*/

public class First3DCanvas extends Canvas implements Runnable

{

     /**World對象*/

     private World myWorld = null;

     /**Graphics3D對象*/

     private Graphics3D g3d = Graphics3D.getInstance();

     /**Camera對象*/

     private Camera cam = null;

     private int viewport_x;

     private int viewport_y;

JAVA手機網[www.cnjm.net]     private int viewport_width;

     private int viewport_height;

     private long worldStartTime = 0;

     //重繪時間

     private int validity = 0;

    

     public First3DCanvas()

     {

           //啓動重繪界面的線程

           Thread thread = new Thread(this);

JAVA手機網[www.cnjm.net]           thread.start();

           try

           {

                  //導入3D圖片

                  myWorld = (World) Loader.load("/swerve.m3g")[0];

                  viewport_x = 0;

JAVA手機網[www.cnjm.net]                  viewport_y = 0;

                  viewport_width = getWidth();

                  viewport_height = getHeight();

                  cam = myWorld.getActiveCamera();

                  //設置cam對象

                  float[] params = new float[4];

                  int type = cam.getProjection(params);

                  if (type != Camera.GENERIC)

                  {

                         //calculate window aspect ratio

                         float waspect = viewport_width / viewport_height;

                         if (waspect < params[1])

                         {

                               float height = viewport_width / params[1];

                               viewport_height = (int) height;

                               viewport_y = (getHeight() - viewport_height) / 2;

JAVA手機網[www.cnjm.net]                         }

                         else

                         {

                               float width = viewport_height * params[1];

                               viewport_width = (int) width;

                               viewport_x = (getWidth() - viewport_width) / 2;

JAVA手機網[www.cnjm.net]                         }

                  }

                  worldStartTime = System.currentTimeMillis();

           }

           catch (Exception e) {}

     }

    

     protected void paint(Graphics g)

     {

           //清除背景

           g.setColor(0x00);

           g.fillRect(0, 0, getWidth(), getHeight());

           //3D對象綁定

           g3d.bindTarget(g);

           g3d.setViewport(viewport_x, viewport_y, viewport_width, viewport_height);

           long startTime = System.currentTimeMillis() - worldStartTime;

           validity = myWorld.animate((int)startTime);

           try

           {

                  g3d.render(myWorld);

           }

           finally

           {

                  g3d.releaseTarget();

           }

     }

 

     public void run()

     {

JAVA手機網[www.cnjm.net]           try

           {

                  while(true)

                  {

                        //重繪圖形

JAVA手機網[www.cnjm.net]                        repaint(viewport_x, viewport_y, viewport_width, viewport_height);

                  }

           }

           catch(Exception e){}

     }

}

 

十七、在J2ME網絡編程中使用CMWAP代理

  在中國移動提供的網絡連接中,分爲CMNETCMWAP兩種,其中CMNET可以無限制的訪問互聯網絡,資費比較貴。CMWAP類似一個HTTP的代碼,只能訪問支持HTTP的應用,但是資費便宜,穩定性比較差。

  在實際的J2ME網絡編程中,一般需要提供以CMWAP代理的方式連接網絡,在J2ME中,連接的代碼和直接連接有所不同,代碼如下:

JAVA手機網[www.cnjm.net]            HttpConnection http = (HttpConnection)Connector.open(("http://10.0.0.172/"+url);

JAVA手機網[www.cnjm.net]            http.setRequestProperty("X-Online-Host",ServerName);

JAVA手機網[www.cnjm.net]  例如你需要訪問的地址爲:http://www.test.com/login/loginServlet則上面的代碼就爲:

            HttpConnection http = (HttpConnection)Connector.open(("http://10.0.0.172/" + "login/loginServlet");

            http.setRequestProperty("X-Online-Host","www.test.com");

  在實際使用過程中,只需要使用實際需要訪問的地址的域名或者IP來代替ServerName,例如示例中的“www.test.com”,使用後續的地址類代替代碼中的url,例如示例中的“login/loginServlet”,就可以實際的使用CMWAP代理來進行連接了。

 

十八、J2ME中的時間處理全攻略

  時間處理在程序開發中相當常見,下面對於時間處理做一個簡單的說明。

  一、時間的表達方式

JAVA手機網[www.cnjm.net]  時間在J2ME中有兩種表達方式:

  1、以和GMT197011號午夜12點和現在相差的毫秒數來代表

  這種方式適合比較兩個時間之間的差值。

  2、以對象的形式來表達

  二、時間處理的相關類

  時間處理在J2ME中涉及三個類:

  1System

   long time = System. currentTimeMillis();

JAVA手機網[www.cnjm.net]  使用該方法可以獲得當前時間,時間的表達方式爲上面提到的第一種。

  2Date

   Date date = new Date();

  獲得當前時間,使用對象的形式來進行表達。

  3Calendar

   Calendar calendar = Calendar. getInstance();

 

三、時間處理的具體操作

  1、以上三種表達方式的轉換:

  a)System類獲得的時間轉換爲Date對象

   Date date = new Date(System. currentTimeMillis());

  b)Date類型的對象轉換爲Calendar類型的對象

   Calendar calendar = Calendar. getInstance();

   Date date = new Date();

JAVA手機網[www.cnjm.net]   calendar.setTime(date);

  2、使用Calendar完成一些日期操作:

  Calendar是時間處理中最常用也是功能最強大的類,可以用它來獲得某個時間的日期、星期幾等信息。

  獲得日期:

JAVA手機網[www.cnjm.net]   Calendar calendar = Calendar. getInstance();

   ……

   int day = calendar.get(Calendar. DATE);

JAVA手機網[www.cnjm.net]  獲得日期、年份、星期的操作和這個類似。

  需要注意的是:Calendar中表示月份的數字和實際相差1,即1月用數字0表示,2月用數字1表示,……12月用數字11表示。

 

十九、J2ME中隨機數字處理全攻略

  在程序中生成隨機數字,用處比較,如人工智能領域等等,這裏對於在J2ME中生成隨機數的操作進行一個簡單的整理,希望對大家能有幫助。

  J2MEJ2SE不同,不能使用Math類的random來生成隨機數字,只能使用java.util包的Random類來生成隨機數字。

JAVA手機網[www.cnjm.net]  1、創建Random類型的對象:

        Random random = new Random();

   Random random = new Random(10010010);

  以上兩種是創建Random對象的方式,第一種使用默認構造方法,和以下的代碼作用完全等價:

JAVA手機網[www.cnjm.net]   Random random = new Random(System. currentTimeMillis());

  相當與使用當前時間作爲種子數字來進行創建。

  第二種方式通過自己來指定種子數字來進行創建。

  大家可以根據需要使用以上兩種方式的任一種。

  2、生成隨機數字:

  創建好了隨機對象以後,我們就可以來生成隨機數字了:

JAVA手機網[www.cnjm.net]  生成隨機整數:

        int k = random.nextInt();

      生成隨機長整數:

        long l = random.nextLong();

JAVA手機網[www.cnjm.net]  3、生成指定範圍的數字:

  例如生成0-10之間的隨機數字:

        int k = random.nextInt();

   int j = Math.abs(k % 10);

  首先生成一個隨機整數k,然後用k10取餘,最後使用Math類的abs方法取絕對值,獲得0-10之間的隨機數字。

  獲得0-15之間的隨機數,類似:

        int k = random.nextInt();

   int j = Math.abs(k % 15);

  獲得10-20之間的隨機數字:

        int k = random.nextInt();

   int j = Math.abs(k % 10) + 10;

 

二十、在J2ME手機編程中使用字體

  在J2ME手機編程中,可以通過使用字體類——Font在低級用戶界面中,獲得更好的表現效果,那麼如何使用Font類呢?

JAVA手機網[www.cnjm.net]  首先,由於手機設備的限制,手機中支持的字體類型很有限,所以在J2ME中只能使用手機支持的默認字體來構造Font類對象。下面是創建Font類的對象時使用的方法:

         getFont(int face,int style,int size);

例如:

         Font font = Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font. SIZE_MEDIUM);

  無論哪一個參數,都只能使用系統設置的數值,這些數值具體的大小在不同的手機上可能不同。下面對於其中的三個參數的取值做詳細的介紹:

  face參數指字體的外觀,其的取值:

  FACE_MONOSPACE——等寬字體

  FACE_PROPORTIONAL——均衡字體

  FACE_SYSTEM——系統字體

  style參數指字體的樣式,其的取值:

  STYLE_BOLD——粗體

  STYLE_ITALIC——斜體

  STYLE_PLAIN——普通

JAVA手機網[www.cnjm.net]  STYLE_UNDERLINED——下劃線

  STYLE_BOLD | STYLE_ITALIC——粗斜體

  STYLE_UNDERLINED | STYLE_BOLD——帶下劃線粗體

  STYLE_UNDERLINED | STYLE_ITALIC——帶下劃線斜體

  STYLE_UNDERLINED | STYLE_ITALIC | STYLE_BOLD——帶下劃線的粗斜體

  size參數指字體的大小,其的取值:

  SIZE_SMALL——小

  SIZE_MEDIUM——中

JAVA手機網[www.cnjm.net]  SIZE_LARGE——大

  通過上面的參數的值,可以組合出你需要的字體對象。

  下面是一些常用的字體操作:

  1. 獲得系統的默認字體:

         Font font = Font.getDefaultFont();

  2. panit方法內部,假設Graphics參數的名稱爲g,則獲得當前字體的方法是:

         Font font = g.getFont();

  3. panit方法內部,假設Graphics參數的名稱爲g,則設置當前字體的方法是:

         g.setFont(font);

  其中font爲你構造好的字體對象。

  4. MIDP2.0中,List可以設置每行的字體格式,方法是:

         list.setFont(0,font);

  則上面的代碼是將list中的第一行設置爲font類型的字體。

JAVA手機網[www.cnjm.net]

二十一、在J2ME手機程序開發中使用顏色

  在J2ME手機開發過程中,需要經常用到顏色來進行繪製,增強程序的表現效果,下面就介紹一下如何使用顏色。

  由於J2ME技術比較簡單,所以沒有實現專門的顏色類,而只是使用RGB的概念來代表顏色。這裏簡單介紹一下RGB的概念,顏色是由紅(Red)、綠(Green)、藍(Blue)三原色組成的,所以可以使用這三個顏色的組合來代表一種具體的顏色,其中RGB的每個數值都位於0-255之間。在表達顏色的時候,即可以使用三個數字來表達,也可以使用一個格式如0X00RRGGBB這樣格式的十六進制來表達,下面是常見顏色的表達形式:

  紅色:(255,0,0)0x00FF0000

  綠色:(0,255,0)0x0000FF00

  藍色:(255,255,255)0x00FFFFFF

  其他顏色也可以通過上面的方式組合出來。

  知道了顏色的表達方式以後,下面來介紹一下如何在J2ME程序中使用顏色,涉及的方法均在Graphics類中,有以下幾個:

  1.getColor()

  獲得當前使用的顏色,返回值是0x00RRGGBB格式的數字。例如:

         int color = g.getColor();

  其中gGraphics類型的對象。

  2.setColor(int RGB)

  設置使用的顏色。例如:

         g.setColor(0x00ff0000);

JAVA手機網[www.cnjm.net]  3.setColor(int red, int green, int blue)

  和上面的方法作用一樣,例如:

JAVA手機網[www.cnjm.net]         g.setColor(255,0,0);

  在設置了Graphics使用的顏色以後,再進行繪製的時候,就可以繪製指定的顏色了。

 

二十二、在J2ME聯網應用中獲得客戶端的手機號碼

JAVA手機網[www.cnjm.net]  在J2ME程序開發過程中,爲了一定的需要,經常需要來獲得用戶的手機號碼,但是這個功能卻在標準的J2ME類庫中沒有提供。

  在使用中國移動的CMWAP方式連接網絡時,中國移動會將用戶的手機號碼放在一個名稱爲x-up-calling-line-id的頭信息中,可以通過讀取該頭信息,獲得用戶的手機號碼,具體代碼如下:

         String usermphone = http.getHeader("x-up-calling-line-id");

  其中httpHttpConnction類型的對象。

 

JAVA手機網[www.cnjm.net]二十三、使用J2ME發送手機短信息

  在程序中,發送短信息的方式一般有三種:

  1 使用程序在網絡上發送短信息,例如各大網站的短信業務。這種方式是通過程序將信息發送給運營商的網關服務器,然後通過運營商的網絡發送給手機。

  2 在計算機中,通過數據線連接到手機,然後通過手機來發送短信息。這種方式是通過使用AT指令來實現。愛立信手機的AT指令你可以在以下地址找到:http://mobilityworld.ericsson.com.cn/development/download_hit.asp

  3 通過在手機中運行的程序來發送短信息。這個正是本文實現的方式。

  在J2ME中,如果想發送短信息,需要使用WMA包,MIDP2.0中已經包含,MIDP1.0中可以通過廠商提供的擴展API實現,和WMA的類庫基本一樣。

      下面是使用WMA向指定手機號碼發送短信息的一個方法,很簡單。當然WMA也提供了其他的方式來發送更多的內容。

JAVA手機網[www.cnjm.net]

JAVA手機網[www.cnjm.net]// SMSUtil.java

package my.util;

import javax.wireless.messaging.*;

import javax.microedition.io.*;

/**

* 發送文本短信息的方法

*/

JAVA手機網[www.cnjm.net]public class SMSUtil

{

     /**

     * 給指定號碼發送短信息

     * @param content 短信息內容

     * @param phoneNumber 手機號碼

JAVA手機網[www.cnjm.net]     * @return 發送成功返回true,否則返回false

     */

     public static boolean send(String content,String phoneNumber)

     {

JAVA手機網[www.cnjm.net]           //返回值

           boolean result = true;

           try

JAVA手機網[www.cnjm.net]           {

                  //地址

                  String address = "sms://+" + phoneNumber;

                  //建立連接

                  MessageConnection conn = (MessageConnection)Connector.open(address);

                  //設置短信息類型爲文本,短信息有文本和二進制兩種類型

                  TextMessage msg = (TextMessage)conn.newMessage(MessageConnection.TEXT_MESSAGE);

                  //設置信息內容

                  msg.setPayloadText(content);

                  //發送

                  conn.send(msg);

           }

           catch(Exception e)

           {

                  result = false;

                  //未處理

           }

           return result;

     }

}

 

JAVA手機網[www.cnjm.net]二十四、使用簡單的J2ME程序測試MIDlet的生命週期

  在MIDlet程序學習中,生命週期是一個比較抽象的概念。其實生命週期就是一個簡單的規定,規定了MIDlet中的每個方法,什麼時候被系統調用。下面是一個示例代碼,在每個方法的內部都輸出一條語句,可以根據程序的輸出結果來驗證各方法被調用的順序,具體代碼如下:

 

 

//文件名:LifeCircleMIDlet.java

import javax.microedition.midlet.*;

/**

* 測試MIDlet的生命週期

*/

public class LifeCircleMIDlet extends MIDlet

{

JAVA手機網[www.cnjm.net]     /**

     * 默認構造方法

     */

JAVA手機網[www.cnjm.net]     public LifeCircleMIDlet()

     {

           System.out.println("默認構造方法");

     }

JAVA手機網[www.cnjm.net]     /**

JAVA手機網[www.cnjm.net]     * 啓動方法

JAVA手機網[www.cnjm.net]     */

     public void startApp()

     {

           System.out.println("startApp方法");

     }

     /**

     * 暫停方法

     */

     public void pauseApp()

     {

JAVA手機網[www.cnjm.net]           System.out.println("pauseApp方法");

     }

     /**

     * 銷燬方法

     * @param b

     */

     public void destroyApp(boolean b)

     {

           System.out.println("destroyApp方法");

     }

}

  在J2WTK中運行該程序時,可以使用瀏覽器中的“MIDlet”菜單中的暫停和恢復菜單,模擬暫停事件。

 

二十五、使用OTA來發布你的程序

  衆所周知,J2ME程序發佈的形式主要有:OTA、數據線傳輸、紅外和藍牙傳輸等。這裏簡單說說如何通過OTA來發布你的程序。

  OTAOver The Air的簡寫,也就是通過網絡下載,這是主要的發佈形式之一。現在的百寶箱都是採用這種形式。

  使用OTA來發布程序,需要如下幾個步驟:

  1、在你的WEB服務器上添加對於jadjar文件的MIME支持。

  後綴名:jad

  MIME類型:text/vnd.sun.j2me.app-descriptor

  後綴名:jar

  MIME類型:application/java-archive

  2、發佈WML頁面:

  例如你的jar文件名test.jad,則最簡單的下載頁面是:

  <?xml version="1.0"?>

  <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.3//EN"

  "http://www.wapforum.org/DTD/wml13.dtd">

  <wml>

JAVA手機網[www.cnjm.net]  <card id="card1" title="Download Midlet">

  <a href="test.jad">test</a>

  </card>

  </wml>

  你可以將以上代碼保存在WEB服務器上,例如保存爲text.wml

  3、修改jad文件:

JAVA手機網[www.cnjm.net]  在jad文件中增加 MIDlet-Jar-URL: http://domain/directory/test.jar

  其中的http://domain/directory/test.jar爲你的jar文件的路徑。

  經過上面的設置,你就可以將你的wml頁面路徑作爲你的WAP下載頁面發佈了。用戶只需要在手機上輸入這個路徑就可以訪問和下載你的程序了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章