iモードJavaがやって来た! 第3章 iアプリを作ろう


技術評論社 JavaPress vol.17 に掲載された記事を公開します (無断転載禁止)。

はじめに / はじめよう / Hello / デジタル時計 / おわりに / 戻る / トップページ


はじめに

Java 対応 i-mode 携帯電話である 503i シリーズが P503i と F503i が 1/26 に発売を開始しました。 それに先駆けて昨年の 12/26、i-mode 用 Java の仕様が公開されました。 その仕様に基づくことで、我々一般ユーザーでも携帯電話上で 動くプログラムが作れるようになりました。 携帯電話上で自作のプログラムが動くことはちょっとした感動です。
 
本記事では i-mode で動く Java プログラムの書き方を解説していきます。 残念ながら本記事執筆時点では実際に開発できる環境が整っていないため、 i-JADE などのエミュレーターで試してみてください (i-JADE の使用方法については本特集の 5 章をご覧下さい)。

i-mode 用 Java をはじめよう

i-mode 用 Java とは ?

i モードで動く Java は正式には Java2 Micro Edition CLDC i モード対応 Java プロファイル と呼び、 DoCoMo のホームページ (http://www.nttdocomo.co.jp/i/java.html) から仕様がダウンロードできます。
 
Java2 Micro Edition (Java2ME) とは組みこみ機器向けの Java2 のエディションで、 一般的な Java2 である Standard Edition のサブセットです。
 
CLDC とは Connected, Limited Device Configuration の略で、 Micro Edition のクラス構成 (Standard Edition のどれだけをサブセット化するか) などを規定しているコンフィグレーションの一つです。 CLDC は KVM (Kirobyte Virtual Machine, キロバイト単位のメモリで動作する 組みこみ機器用の VM) を使います。
 
さらに用途向けの用意された特殊な API (プロファイルと呼びます) が用意されており、「i モード対応 Java プロファイル」がその名の通り、 i モード向けのプロファイルです。 他に携帯電話向けプロファイルとして Mobile Information Device Profile (MIDP) もありますが、 i-mode 上では動作しません。 i モード対応 Java プロファイルは Java 対応 i-mode のリリース時期に MIDP 正式版の規定が間に合わなかったため、 DoCoMo によって作成された i-mode 用のプロファイルです。
 

i アプリ

i モード対応 Java プロファイルに基づいて作成されたアプリケーションを i アプリと呼びます。 携帯電話で i アプリをダウンロードして実行する形になります。
 
i モード対応 Java プロファイルの特徴的な点に、 ファイルサイズは jar 圧縮で最大 10KB までとの制限があります。 これは i アプリのダウンロードにかかるパケット代と携帯電話のメモリ容量、 ダウンロード時間に対する配慮からつけられている制限です。
 
また、一時的に画像や文字列などのデータを保存するスクラッチパッドと 呼ばれる領域が用意されているのも特有の機能です。 スクラッチパッドには 1 つの i アプリについて最高 5KB まで保存できます。
 
GIF ファイルと i-メロディファイルが使えるのも特有の機能です。 他にはエージェントモードがサポートされています。 これは i アプリを一定時間間隔ごとに定期的に自動起動するものです。 また、セキュリティーへの配慮として携帯のアドレス帳などの 情報にはアクセスできない、 アプレットのようにダウンロード元のサイトに対してのみネットワーク接続できる、 i アプリから他の i アプリは起動できない、 といった制限もかけられています。

Hello

まずは簡単なプログラムから始めていきましょう。 API の概要を説明していきながら、 プログラムの基本「Hello」から始めていきます。
 

マニュアル

まずは、マニュアルをダウンロードしましょう。 http://www.nttdocomo.co.jp/i/java.html から仕様書である「iモード対応Javaコンテンツ開発ガイド(詳細編)」と API マニュアルである 「iモード対応Javaコンテンツ開発ガイド(APIリファレンス編)」 がダウンロードできます。いずれも pdf 形式になっています。 また、この API マニュアルには CLDC のクラスに関する説明は 省かれていますので、 http://java.sun.com/products/cldc/ から CLDC の API マニュアルもダウンロードしましょう。 このホームページは英語ですが、 日本語の CLDC の API マニュアルが用意されています。 「Japanese documentation for the J2ME CLDC」とかかれた部分から ダウンロードできます。
 

API

i モード対応 Java プロファイルは 3 つの API 層から構成されています。
 
Java2ME CLDC で定義されている必要最小限の Java API (java. で始まるパッケージ)、 i モード対応 Java プロファイルで定義されている i-mode 用 API (com.nttdocomo. で始まるパッケージ)、 携帯メーカーによる機種ごとの拡張機能用 API です。
 
CLDC で定義されている API は言語である Java を構成するもので、 ユーザーインターフェースのクラスも含まれていません。
 
拡張機能用 API を使用すれば当然特定機種でしか動作しなくなります。 仕様も公開されていないため、 本記事では拡張 API は取り扱わないことにします。 音声やバイブレーション機能は機種ごとの拡張機能用 API に含まれます。
 
また、i モード対応 Java プロファイルは CLDC に分類されているため、 浮動小数点 (float, double 型) は使えません。 また、スレッドグループやファイナライズも使えませんので、注意しましょう。
 

Hello.java

画面に "こんにちは" と表示されるプログラムです。 Hello.java (リスト 1) をご覧下さい。 i-jade 上で動かした実行結果を図 1 に示します。
 
(図1 Hello.java の実行結果)
 

i アプリの基本

i アプリは com.nttdocomo.ui.IApplication クラスを継承して作ります (Applet と同じ要領です)。 リスト 1 の Hello クラスもこれに従っています。 IApplication クラスを継承したら、 start() メソッドをオーバーライドする必要があります。 このメソッドは起動した時に呼ばれます。
 
リスト 1 では使用していませんが、 i アプリを終了させるには System.exit() ではなく IApplication オブジェクトの terminate() メソッドを呼び出します。 また、i アプリは携帯電話で動作するため、 電話がかかってきて中断されることがあります。 電話が切られた後の i アプリ再開時に resume() メソッドが呼ばれますので、 必要があれば resume() メソッドもオーバーライドします。
 

ユーザーインターフェース

Java2 Micro Edition、i モード対応 Java プロファイルには AWT はなく、 その代わりのユーザーインターフェース (UI) として com.nttdocomo.ui パッケージが用意されています。
 
画面そのものが Display クラス、 表示される内容は Frame オブジェクトで表現されます。 Display クラスのメソッドは全て static 宣言されています。 画面に表示する内容を Frame クラスのサブクラスから選び、 そのオブジェクトを Display クラスに設定します。
 
表示されるもの、つまり Frame クラスのサブクラスとして、 Canvas クラスと Panel クラス、Dialog クラスがあります。 Panel オブジェクトには各種コンポーネント (ボタンやラベルなど) が追加できます。 Canvas オブジェクトは AWT の Canvas クラスのように 自由に絵を描くことが出来ます。 Dialog オブジェクトはその名のとおりいわゆるダイアログです。
 
リスト 1 の start() メソッドの中を見てください。 Display クラス (画面) に Panel オブジェクトを設定し、 その Panel オブジェクトにラベル "こんにちは" を貼り付けました。
 
i モード対応 Java プロファイルのユーザーインターフェースは 高レベル API と低レベル API に分類されています。 Panel オブジェクトにコンポーネントを追加して使用する ユーザーインターフェースを高レベル API、 Canvas オブジェクトで自分で表示や入力を処理する ユーザーインターフェースを低レベル API としており、 この 2 種類ではイベントの処理などの方法が異なります。 本章では高レベル API を使った UI について説明し、 低レベル API については次章で解説します。
 

公開方法

 
i アプリの実際に公開方法についても説明しておきましょう。 i アプリを公開するには i アプリとその関連ファイルを jar 圧縮して、 その jar ファイルに関する情報を記述した ADF (jam ファイル) を作る必要があります。 jam ファイルは jar ファイルの置いてある URL や サイズを記述したテキストファイルです (リスト2)。
 
この 2 ファイルを web サーバー上に置いて、 HTML にダウンロード用のタグを記述すれば公開できます。 サーバー側に特別な設定は必要ありません。
 
リスト 3 のように OBJECT タグで jam ファイルを指定し、 A タグの IJAM 属性でそれを指すようにします。 携帯でそのリンクをクリックするとダウンロードが出来ます。 i アプリ未対応の携帯では A タグの HREF 属性 (必須) で示された ページに飛びます。
(リスト2 JAM ファイル例)
	PackageURL = http://cgi14.plala.or.jp/antun/sample.jar
	AppSize = 1159
	AppName = Hello
	AppClass = Hello
	LastModified = Sun, 18 Feb 2001 21:23:24
(リスト3 ダウンロード用 HTML ファイル)
	<OBJECT DECLARE ID="sample" DATA="http://cgi14.plala.or.jp/antun/sample.jam"
	 TYPE="application/x-jam">
	 サンプルアプリケーション
	</OBJECT>
	
	<A IJAM="#sample" HREF="old-phone.html">ここ</A>

デジタル時計

次はもうちょっと複雑なコードを使って 高レベル API UI についての理解を深めましょう。 デジタル時計の i アプリです。 Watch.java (リスト 4) をご覧下さい。 i-jade 上で動かした実行結果を図 2 に示します。
 
画面にはデジタルで現在の時刻が表示され、 その下に「計測」ボタンとテキストが入力できる領域があります。 「計測」ボタンを押すとテキスト領域に現在の時刻が入力されます。 また、携帯の左のソフトキー (普段メニュー呼び出しなどが割り当てられているキー) を押すと i アプリは終了します。
 
(図2 Watch.java の実行結果)
 

高レベル API UI

高レベル API では Display クラスに Panel オブジェクトを設定し、 その Panel オブジェクトに対してボタンやラベルなどの Component クラスのサブクラスのオブジェクトを add(Component c) メソッドで追加していきます。 Component クラスのサブクラスとして表 1 に示す UI コンポーネントがあります。
 
クラス 機能
Label 文字列の表示
ImageLabel 画像の表示
Button ボタン
ListBox リスト
TextBox テキスト入力
Ticker 流れる文字列
VisualPresenterメディア再生
(表 1、UI コンポーネント)
 
リスト 4 の start() メソッドをご覧下さい。 Panel オブジェクトを生成し、 そこに UI コンポーネントのラベル now、ボタン button、 テキスト入力 snapshot を貼り付けています。 これらのレイアウトは実際の携帯の機種に依存します。
 

高レベル API UI のイベント処理

高レベル API UI ではイベントはリスナーによって処理できます。 Java2 Standard Edition とは違い、add***Listener ではなく、 set***Listener である点に注意してください。 リスナーは 1 つしか設定できません。 また、全てのイベントは各 Component オブジェクトにではなく、 Panel オブジェクトに通知され、そこからリスナーへと通知されます。 そのためにリスナーは Panal オブジェクトに登録します。
 
イベントの種類としてはキー押下、ソフトキー押下、 コンポーネント操作があります。
 

コンポーネント操作イベント

「計測」ボタンを押した時にコンポーネント操作イベントが発生しますので、 その処理を書きます。まず、Watch クラスをリスナーとするために、 ComponentListener インターフェースを実装します。
 
そして、Panal オブジェクトに setComponentListener(ComponentListener listener) メソッドで Watch オブジェクトをリスナーとして設定します。
 
ボタンが押されるとリスナーの componentAction(Component source,int type,int param) メソッドが呼ばれます。 変数 source にはイベントの発生した UI コンポーネントが、 type にはイベントの種類が ComponentListener クラスの定数で、 param にはイベントごとのパラメーター値が渡されます。 ボタン以外の UI コンポーネントが操作されたされたときにも このメソッドは呼ばれます。
 

ソフトキーイベント

左のソフトキーを押した時にはソフトキー押下イベントが発生しますので、 コンポーネント操作イベントと同様に Watch オブジェクトをリスナーとして指定しています。 リスナーは SoftKeyListener インターフェースを実装し、 リスナーの設定は Panal オブジェクトの setSoftKeyListener(SoftKeyListener listener) メソッドで設定します。
 
ソフトキーが押されるとソフトキーリスナーの softKeyPressed(int softKey) メソッドが呼ばれます。 引数 softKey にはいずれのソフトキーが押されたかが Frame.SOFT_KEY_1 または Frame.SOFT_KEY_2 で示されます。
 
ソフトキーは携帯画面の下にその役割が表示されている機能を持ったキーで、 その役割のラベルを設定することも出来ます。 Panel クラスの setSoftLabel(int key,String label) メソッドで ソフトキーの表示内容を設定します。 リスト 4 ではアプリケーションの終了をソフトキーに割り当てていますので、 start() メソッド内で「終了」のラベルを設定しています。
 

タイマー

i モード対応 Java プロファイルでは定期的な処理や数秒後に 処理を実行させるために、タイマークラスが用意されています。 Thread を使って自分で同様の処理を実装してもかまいませんが、 i アプリは 10KB しか使えませんから、 コード量が減らせる便利なタイマークラスを使うと良いと思います。
 
タイマークラスは com.nttdocomo.util.Timer クラスです。 Java2 Standard Edition の java.util.Timer クラスとは 名前や使用目的は同じですが、 別のクラスで使い方が違うので注意が必要です。 Timer クラスは一定時間経過後に処理を行うワンショットタイマと 定期的に処理を行うインターバルタイマの 2 通りの使い方が出来ます。
 
使い方は Timer オブジェクトを生成し、 setListener(TimerListener listener) メソッドでリスナーを登録します。 そして、setRepeat(boolean b) メソッドでインターバルタイマか否か、 setTime(int time) メソッドで時間間隔を設定します。 start() メソッドでタイマーを開始し、 処理する時間になるとリスナー (TimerListener インターフェースを実装したクラス) の timerExpired(Timer source) メソッドが呼ばれます。 終了時は stop() メソッドで停止、dispose() メソッドで破棄します。
 
リスト 4 では Watch オブジェクトをリスナーとし、 500ms ごとに定期処理しています。 timerExpired(Timer source) メソッドが 500ms ごとに呼ばれ、 現在時刻を表示しています。

おわりに

高レベル API UI を中心に i モード対応 Java プロファイルの使い方を解説してきましたが、 いかがでしたでしょうか。
 
次章では低レベル API UI を使った i アプリについて解説します。

戻る