礒山 賢司

今回のサンプル・プログラムのダウンロードはこちら

図1●iアプリが定義している特殊文字
 前回まででアプリケーションを作成するために必要な基礎的な事項を一通り解説しました。今回からは特殊文字やイメージの扱い,マルチメディア,ネットワーキングなど,付加的なプログラミング・ノウハウを解説していきたいと思います。

●特殊文字の扱い

 皆さんもご存知のように,iモード携帯電話には,メールなどで利用することができる特殊な文字,すなわち「絵文字(図1[拡大表示])」が定義されています(一部携帯電話メーカー独自の絵文字も含んでいます。NTTドコモが定義する絵文字は「晴れ」以降です)。これらは,特殊なコード体系(NTTドコモ仕様による文字コード定義外文字)により実現しているため,残念ながら,通常のプログラミングでは利用できません。これらの文字を使用する場合は,文字コードにあたる16進コードからシフトJISコードへの変換が必要です。

 この絵文字を扱ったサンプル・プログラムがリスト13です。このプログラムでは,パネル上に2つのボタンとラベルを配置し,それぞれのボタンのキャプションには絵文字を設定します。ボタンを押すと,ラベルに絵文字を表示します。

 現在,iモード携帯電話でNTTドコモが定義している絵文字として扱えるコード範囲は「0xF89F~F9AF」です。携帯電話メーカーが独自に提供している絵文字に関しては,この範囲外で定義されています。このメーカー独自部分についての詳細な定義は,メーカーが提供するのを待つ以外ありませんが,図を見ていただいても分かるように,ドコモ絵文字だけでも,表現のアクセントには十分な数が提供されています。

●リソースの扱い

 iアプリでは,アニメーションを含む画像の表示や,音声ファイルを再生する機能を提供しています。画像や音声のファイルをリソースと言いますが,これらはアーカイブ・ファイルである「.JAR」ファイルや,ネットワーク越しに存在するWebサーバー上に存在します。iアプリでは,リソースのロケーション(存在場所)が,アーカイブ,Webのどちらに存在しようと,統一的なアクセス方法を提供しています。

 アーカイブ・リソースの場合は

 resource:///
  (JARファイルに格納されたリソースの相対パス)
  例:resource:///Image.gif
    resource:///img/Image.gif

 Webのリソースの場合は

  http://itpro.nikkeibp.co.jp/i-mode/resource/Image.gif

のようになります。

 どちらのリソースを利用するにしても,相対的な位置さえ決まっていれば,先頭の格納場所のパスさえ変更すれば,どちらのアクセスも可能になります。

 リソースのロケーションは多くの場合,「テストのときはアーカイブ」,「本番ではWeb」という開発運用が多いのではないでしょうか。このような場合は,ADFの「AppParam」キーを活用します。JAMファイルに

 AppParam = resource:///
 #AppParam = http://itpro.nikkeibp.co.jp/i-mode/resource

というように定義しておき,先頭の「#(ADFではこれ以降がコメントとして扱われます)」で切り替えるのです。

図2●ADFを変更すると,表示が切り替わる
 リスト14が,このように対応したプログラムで,ADFはList14.jamです。試しにADFのAppParam定義だけをいろいろ変更して,実行してみてください。図2[拡大表示]のように表示が切り替わるはずです。これを応用することで,プログラムを再コンパイルすることなく,テストと本番の動作切替を簡単に行うことができます。

●画像の扱い

 静止画または動画を扱うときは,MediaImageインタフェースを利用します。MediaImageインタフェースは,MediaManagerのクラスを利用して,メディア・リソースを画像として取り扱う手段を提供します。実際のプログラミングは,このような堅苦しいことを考える必要もなく,

 try {
  MediaImage MI = MediaManager.getImage( AppParam[0] + "/JavaLogo.gif" );
  MI.use();
  img = MI.getImage();
 }
 catch( Exception x ) {
  terminate();
 }

のように,MediaManagerのgetImage( )メソッドで画像を取得し,use( )メソッドでメディア・リソースを使用開始します。すると,実際にメディア・リソースがロードされ,内部形式に変換されます。最後は利用するImageオブジェクトへ取得したリソースを設定するだけです。ただし,この処理は外部リソース・アクセスとなるため,プログラムの中に例外処理を記述しておかなければなりません。

 リスト15のサンプルは,Panelオブジェクト,Canvasオブジェクト,それぞれにイメージを表示しています。ソフト・キーのイベントで,表示オブジェクトを切り替えています。

●音の扱い

 iアプリでは,画像の表示だけでなく「iメロディ(コンパクトMIDI)」のフォーマットに準拠した音(楽曲)を再生できます。このリソースも,扱い方はイメージと同様です。プログラミングの異なるところは,(1)リソースを扱うオブジェクトが異なる,(2)メディアを制御するオブジェクトが必要,ということです(リスト16)。

 ここでのポイントは,メディア・リソースの管理オブジェクトであるMediaManagerの「getSound( )メソッド」を利用することです。

 sound = MediaManager.getSound( SoundName );
 try {
  sound.use();
 }
 catch( Exception x ) {
  terminate();
 }
 audio.setSound( sound );

 先ほどの画像の扱いでも,MediaManagerを利用したのを覚えているでしょうか。このようにMediaManagerは,さまざまなメディア・リソースのデータを統括的に管理する機能を提供してくれます。これ以外にプログラミングで必要なことは,(1)play( )メソッドでの再生,(2)stop()メソッドでの停止,です。

 「再生している音楽が停止したら再生し直したい」,例えば,ゲームを作成する際に,バックグラウンドで流れるテーマ曲やゲーム曲を繰り返し再生したいなどという要望は多いことでしょう。

 このような時は,メディアの再生を制御している「AudioPresenter」からのメディア・イベントを利用します。メディア・イベントでは,「再生した」「停止した」など音の状態に応じてイベントが発生します。アプリケーションでは,このイベントを取得することで処理を実行します。例えば,「繰り返し再生」を実現したいならば,(1)「AudioPresenter.AUDIO_COMPLETE」で再生の終了を確認,(2)再度play( )メソッドを呼び出す,とします。

 リスト16では,キーによる「再生」,「停止」のほか,再生が終了したときのイベント通知を受けて,繰り返し再生しています。

 残念ながら,このサンプルについては,エミュレータで音を聴くことができません。動作を確認する際は,提供しているパッケージも含めてインターネットのサイトに配置して,手持ちの503iシリーズにダウンロードして確かめてください。その時は,ADFファイルの「AppParam」の値を配置したURLに変更してください。

 連載最後となる次回では,ゲームなどのプログラミングに欠かせない「スレッド」,携帯電話の真骨頂とも言える「ネットワーキング」,そして永続記憶を提供する「スクラッチ・パッド」を利用するためのプログラミングを紹介します。最後には,筆者も経験したプログラミングのコツについても伝授したいと思います。