iモードJavaプログラミング 504i対応版 サンプルPDF/アスキー出版局

はじめに
本書は、
「i モード Java プログラミング」シリーズの 504i 対応版として、その新機能を余すこと
なく活用できるように、最新機能の詳細解説とプログラム事例、そして API リファレンスから各
種参考資料までを1冊にまとめたものだ。
2001 年1月に NTT ドコモから発売された世界初の Java 搭載携帯電話である 503i シリーズは、
発売から1年半を経た 2002 年5月に第2世代の Java を搭載した 504i シリーズへと進化した。503i
シリーズは、NTT ドコモの主力機種ということもあり、1年半の間に 1,400 万台を越え、全 i モー
ド対応携帯電話の 40%を越えるところまで来ている。また、au や J-Phone も主力機種に Java 搭
載携帯電話を投入しており、Java は日本の携帯電話の主要な機能の1つにあっという間になって
しまった。
しかし、現時点では肝心のキラーアプリは依然として「ゲーム」であり、公式/非公式を含め
5,000 本を越えて提供されている i アプリもバラエティに富んでいるとは言い難い状況だ。第2世
代の Java を搭載した 504i シリーズは、この現状にどのように応えてくれるのだろうか。その1
つは、スクラッチパッドエリアが 10K バイトから 100K バイトに拡張されたことだろう。さまざ
まなデータをスクラッチパッドに格納し、ビュアーとしての i アプリを作成することでデータの
活用が可能になる。赤外線通信機能は、音声、メール、ブラウザに続く、重要なコミュニケーショ
ン手段になりうる。携帯 to 携帯はもちろんだが、赤外線をしゃべる自販機や情報端末が増えるこ
とにより、i アプリによる簡単な操作で各種のコントロールや情報交換が行える。そして、ネイ
ティブアプリケーションとの連携機能や待ち受けアプリは、単体として閉じざる負えなかったこ
れまでの i アプリから、ブラウザやメールとの連携を行うことにより、シームレスで使いやすい i
アプリの作成を可能にした。
このように Java が搭載されたことによる携帯電話のパソコン化の流れは、たぶん止まること
はないであろう。しかし、携帯 Java は発展途上であり、かつての MS-DOS も Windows も Ver.2
では必要かつ十分な機能を有していたわけではないことを思い起こすと、第2世代に続く第3世
代携帯 Java 以降ではさらなるブレイクが起こり、誰しもがごく普通に使うアプリが数多く流通し
ていることを大いに期待したいところだ。
2001 年に出版した 503i シリーズ対応の「i モード Java プログラミング」シリーズでは、テーマ
別に3分冊の構成となっていたが、本書「504i 対応版」では、使い勝手を考え、プログラミングに
必要なすべての内容を1冊に凝縮した。本書が、ますます可能性を広げつつある携帯 Java プログ
ラミングの一助になれば幸いである。
2002 年 7 月 アスキー書籍編集部
3
本書の構成
本書は、
「i モード Java プログラミング」シリーズの 504i 対応版として、504i の新機能を中心と
した解説と API リファレンスや各種参考資料など、この1冊で 504i Java のすべてがわかる構成
となっています。
本書の読者対象としては、Java のプログラミング経験があることを前提としています。はじめ
て Java のプログラミングにチャレンジされる方は、姉妹書の「i アプリではじめて学ぶ Java プロ
グラミング」を先にお読みになることをお薦めいたします。また、503i シリーズに対応した Java
プログラミングに関しては、本書では取り上げていませんので、必要に応じて、前書「i モード Java
プログラミング」シリーズをご覧ください。
本書には CD-ROM が添付されていますが、開発環境は付属していませんので、本文を参照し
て、該当の Web ページより開発環境をダウンロードする必要があります。あらかじめご了承くだ
さい。
●
NTT ドコモの Web ページより、
「DoJa2.0 API 向け iappli Development Kit」をダウンロー
ドする(2.85MB)
●
サンの Web ページより、
「J2SE v1.3.1」をダウンロードする(35.67MB)
■ 本書の内容
本書の各 Part の概要を以下に紹介します。本書では、ネットワーク対応 i アプリの作成に関し
ては取り上げていません。ネットワーク対応 i アプリの詳細に関しては、姉妹書「i モード Java プ
ログラミング ネットワーク・アプリケーション編」をご覧ください。
なお本書は、5名の著者が担当分野ごとに執筆しています。巻末の著者紹介をご覧ください。
■
Part1 準備編
i アプリの位置づけや 504i Java の新機能の概要と、開発環境のセットアップ方法と使い方、i ア
プリの開発手順を解説します。
■
Part2 開発編
504i で追加された主要な拡張 API を中心に、サンプルプログラムを交えながら、その機能を詳
細に解説します。
■
Part3 プログラム事例編
具体的なサンプルプログラム事例を紹介します。なお、ソースコードは、すべて CD-ROM に
収録されていますので、そちらをご覧ください。
4
本書の構成
■
Part4 i モード Java 拡張 API リファレンス
i モード Java 拡張 API の詳細なリファレンスを掲載しています。DoJa2.0 で追加、変更になっ
た API は一目でわかるように配慮しました。なお、com.nttdocomo.opt.ui.j3d2 パッケージに関し
ては、現時点では D504i のみの対応となっているため、本 Part では割愛しています。
■
Part5 参考資料
機種実装依存一覧、API 実装一覧、i モードグラフィック文字一覧など、プログラミングに役立
つ各種の参考資料を掲載しています。
■ 付属 CD-ROM について
付属 CD-ROM には、下記のソフトウェアと、本書で紹介したサンプルプログラムのソースコー
ド、実行形式のファイルなどが含まれています。付属 CD-ROM の内容やアプリケーションのイ
ンストール方法などについては、巻末の使い方を参照してください。
■
i-JADE Basic for P504i 体験版(503i エミュレータ+i モード拡張ライブラリ)
株式会社ゼンテック・テクノロジー・ジャパン http://www.zentek.com/
Copyright (C) 2002 Zentek Technology Japan,Co.,Ltd. All Rights Reserved.
■
待受けアプリメーカー 504 α版(Windows 版待ち受け i アプリ作成ツール)
株式会社末広 http://www.tanakade.com/
Copyright (c) 2002, SUEHIRO Ltd., All Rights Reserved.
なお、8章の一部のサンプルプログラムのソースファイルは、以下の Web ページよりダウン
ロードが行えます。また、Part3 に掲載した一部の i アプリは、下記から携帯電話にダウンロード
してすぐにお使いいただけます。また最新版へのアップデート情報なども、下記をご覧ください。
http://www.ascii.co.jp/pb/ant/iappli2/
本書の内容は、株式会社 NTT ドコモ、サンマイクロシステムズが公開している情報、およびインターネット
の各種 Web サイトでの情報などをもとに、株式会社アスキーが独自に編集/制作を行ったものです。株式会
社 NTT ドコモ、サンマイクロシステムズは、本書の内容には関知しておりませんので、内容に関してのお問
い合わせはご遠慮ください。
プログラムの著作権は、各プログラムの開発者に帰属します。本書に掲載したプログラムの使用にあたって
は、利用方法や留意点などをよくお読みの上、ご自身の責任でご利用いただきますようお願いいたします。プ
ログラムを使用した結果生じた損害については、株式会社アスキーおよび開発者はいっさい保証できません。
5
目次
Part 1
準備編
第 1 章 504i Java はここが変わった
13
1.1 i アプリとは ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・13
1.2 DoJa プロファイル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・14
1.3 au と J-Phone の Java 対応携帯電話 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・24
第 2 章 i モード Java 開発環境
27
2.1 開発に必要なハードウェア ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・27
2.2 開発に必要なソフトウェア ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・27
2.3 開発環境のインストールと開発手順 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・29
2.4 iappliTool のオプション設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・33
2.5 アップロードと実機での動作確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・35
Part 2
開発編
第 3 章 i アプリプログラミングの基礎知識
39
3.1 i アプリの構造 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・39
3.2 2 つの GUI ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・41
第 4 章 待ち受けアプリケーション
58
4.1 待ち受けアプリの概要と状態遷移 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・58
4.1.1 待ち受けアプリの3つの状態 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・59
4.1.2 待ち受けアプリのシステムイベント ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・61
4.2 待ち受けアプリのプログラム例 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・62
4.2.1 MApplication で追加されたメソッド ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・62
4.2.2 最も簡単な待ち受けアプリ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・63
4.2.3 待ち受けアプリに時刻を表示する ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・65
4.2.4 待ち受けアプリが通常起動されたときの対応 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・67
4.2.5 待ち受けアプリの完成版 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・67
4.2.6 待ち受けアプリ作成時の注意点 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・71
4.3 エミュレータのチェックと実機での確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・72
6
目次
第5章
赤外線通信の活用
78
5.1 赤外線通信の概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・78
5.2 赤外線通信機能を使ったプログラム例 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・79
5.2.1 クライアント側の赤外線通信の手順 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・80
5.2.2 クライアント側のサンプルプログラム ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・82
5.2.3 サーバー側の赤外線通信の手順 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・82
5.2.4 サーバー側のサンプルプログラム ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・84
5.2.5 赤外線通信プログラムの完成版 −IRPad ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・85
5.3 エミュレータの使い方と実機での動作 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・88
5.4 ネイティブアプリとのデータ交換 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・89
第6章
2D/3D グラフィックス
91
6.1 2D グラフィックス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・91
6.1.1 イメージマップ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・91
6.1.2 ズーム座標系 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・93
6.1.3 スプライト ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・93
6.1.4 ピクセル操作 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・96
6.1.5 透明色付きイメージ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・97
6.1.6 パレット付きイメージ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・97
6.1.7 イメージの回転・反転・拡大縮小 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・98
6.1.8 描画クリッピング ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・100
6.1.9 ラスターオペレーション ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・101
6.1.10 その他の拡張 API ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・103
6.2 3D グラフィックス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・103
6.2.1 作成環境の準備 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・104
6.2.2 3D データの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・105
6.2.3 3D グラフィックス表示に使用するクラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・107
6.2.4 3D 描画プログラムの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・108
6.2.5 3D ポットデモ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・112
第7章
マルチメディア機能
118
7.1 静止画 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・118
7.2 動画 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・123
7.3 音声 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・125
第8章
ネイティブアプリケーションとの連携
135
8.1 ネイティブアプリケーションからの i アプリ起動 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・135
8.2 メールによる i アプリの起動 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・138
7
目次
8.3 ブラウザによる i アプリの起動 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・140
8.4 i アプリによるブラウザの起動 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・142
8.5 i アプリによる通話呼び出し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・144
8.6 外部機器との連携 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・146
8.7 ネイティブリソースの制御 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・148
Part 3
プログラム事例編
決死の PK 合戦 IR 版
pkir.jar
スケジューラ 待ち受け/IR 対応版
決死の PK 合戦 メール版
日記帳
Diary.jar
Scheduler.jar
pkmail.jar
赤外線名刺 NameCard.jar
ポーカー対戦 IR 版
159
ゲーム
実用
ゲーム
171
ゲーム
173
実用
ポーカー対戦 メール版
Part 4
166
169
実用
pokerIr.jar
161
pokermail.jar
ゲーム
175
i モード Java 拡張 API リファレンス
各パッケージの階層構造
179
com.nttdocomo.ui
AnchorButton クラス
DoJa2.0 ・
・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・
・・182
AudioPresenter クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・184
Button クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・189
Canvas クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・191
Component クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・195
ComponentListener インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・198
Dialog クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・199
Display クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・201
FocusManager インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・204
Font クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・205
Frame クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・209
Graphics クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・211
HTMLLayout クラス
DoJa2.0 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・219
IApplication クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・221
Image クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・224
ImageButton クラス
8
DoJa2.0 ・・・・・
・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・
・・226
目次
ImageLabel クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・228
Interactable インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・229
KeyListener インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・230
Label クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・232
LayoutManager インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・234
ListBox クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・235
MApplication クラス
DoJa2.0 ・
・
・
・・
・
・
・
・・
・
・
・
・
・・
・
・
・
・・
・
・
・
・
・・
・
・
・
・・
・
・
・
・
・・
・
・
・
・・
・
・
・
・
・・
・
・
・
・・
・
・
・
・
・・
・
・
・
・
・240
MediaData インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・243
MediaImage インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・243
MediaListener インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・245
MediaManager クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・246
MediaPresenter インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・247
MediaResource インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・249
MediaSound インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・250
Panel クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・251
PhoneSystem クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・254
ShortTimer クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・257
SoftKeyListener インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・259
TextBox クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・260
Ticker クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・263
VisualPresenter クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・264
com.nttdocomo.util
EventListener インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・268
Phone クラス
DoJa2.0 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・268
TimeKeeper インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・269
Timer クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・270
TimerListener インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・272
com.nttdocomo.io
ClientObexConnection インターフェイス
DoJa2.0 ・
・
・・
・
・
・・
・
・
・・
・
・
・・
・
・
・・
・
・
・・
・
・・
・
・
・・
・
・
・・
・
・
・・
・
・
・274
HttpConnection インターフェイス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・276
ObexConnection インターフェイス
DoJa2.0 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・284
ServerObexConnection インターフェイス
DoJa2.0 ・・・
・・・
・・・
・・
・・・
・・・
・・・
・・・
・・
・・・
・・・
・・・
・・
・・・
・・287
com.nttdocomo.net
URLDecoder クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・290
URLEncoder クラス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・291
例外
ConnectionException 例外 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・292
IllegalStateException 例外
DoJa2.0 ・
・・・・
・・・・・
・・・・
・・・・・
・・・・
・・・・・
・・・・
・・・・・
・・・・
・・・・・
・・・・
・・・・・
・・・293
9
目次
UIException 例外 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・293
UnsupportedOperationException 例外 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・295
com.nttdocomo.opt.ui
DoJa2.0 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・296
AudioPresenter2 クラス
Graphics2 クラス
DoJa2.0 ・
・・
・・
・・
・・
・
・・
・・
・・
・・
・・
・・
・・
・・
・・
・・
・・
・・
・・
・
・・
・・
・・
・・
・・
・・
・・
・・
・・
・・
・・
・・
・
・・
・・
・・298
ImageMap クラス
DoJa2.0 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・305
DoJa2.0 ・・・・
・・・・
・・・・
・・・・・
・・・・
・・・・
・・・・
・・・・・
・・・・
・・・・
・・・・
・・・・・
・・・・
・・・・
・・・・
・・・・・
・・・・308
Palette クラス
DoJa2.0 ・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・
・・309
PalettedImage クラス
PhoneResource クラス
DoJa2.0 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・311
PhoneSystem2 クラス
DoJa2.0 ・
・
・
・
・・
・
・
・
・
・
・
・・
・
・
・
・
・
・・
・
・
・
・
・
・
・・
・
・
・
・
・
・・
・
・
・
・
・
・・
・
・
・
・
・
・
・・
・
・
・
・
・
・・
・
・
・
・
・313
DoJa2.0 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・317
Sprite クラス
SpriteSet クラス
DoJa2.0 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・320
SubDisplay クラス
DoJa2.0 ・・
・
・
・・
・
・
・
・・
・
・
・・
・
・
・
・・
・
・
・・
・
・
・
・・
・
・
・・
・
・
・
・・
・
・
・・
・
・
・
・・
・
・
・・
・
・
・
・・
・
・
・・
・
・
・
・・
・
・323
TransparentImage クラス
DoJa2.0 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・324
com.nttdocomo.opt.ui.j3d
ActionTable クラス
DoJa2.0 ・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・
・・・326
AffineTrans クラス
DoJa2.0 ・・
・・
・・
・・
・・
・・
・
・・
・・
・・
・・
・・
・・
・
・・
・・
・・
・・
・・
・・
・
・・
・・
・・
・・
・・
・・
・
・・
・・
・・
・・
・・
・・
・
・・327
DoJa2.0 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・331
Figure クラス
Graphics3D インターフェイス
Math クラス
DoJa2.0 ・・・・
・・・・・・
・・・・・・
・・・・・・・
・・・・・・
・・・・・・
・・・・・・
・・・・・・
・・・・・・・332
DoJa2.0 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・335
Texture クラス
Vector3D クラス
DoJa2.0 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・336
DoJa2.0 ・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
・・・・・・・338
Part 5
参考資料
ADF ファイルのエントリ
343
機種実装依存一覧
347
主要機種のシステム情報 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・347
i モード対応 HTML4.0 ユーザーエージェント一覧 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・348
主要機種 API 実装一覧
349
i アプリ基本パッケージ内に追加されているオプション API/拡張 API ・・・・・・・・・・・・・・・・349
オプションパッケージに新設されたオプション API/拡張 API ・・・・・・・・・・・・・・・・・・・・・・・・351
i モードグラフィック文字一覧
357
参考リンク
363
インターフェイス/クラス索引 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・364
メソッド索引 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・366
付属 CD-ROM の使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・372
10
1章
504i Java はここが変わった
本書は、NTT ドコモの 503i シリーズですでに i アプリを組んだことのある読者をメインター
ゲットとしています。ここでは復習もかねて i アプリの位置づけをまとめ、503i シリーズの Java
との違いを述べておきましょう。504i で追加された主要 API の解説は Part2 で行いますので、具
体的な変更点はそちらを参照してください。
また、最後に au や J-Phone の Java 対応携帯電話に関しても簡単に紹介しています。
1.1 i アプリとは
i アプリは、NTT ドコモの携帯電話で実行可能な Java アプリケーションのことです。2001 年 1
月に発売された 503i シリーズから、世界初の Java 対応携帯電話として i アプリの実行環境が実装
されました。その後 503iS シリーズを経て、2002 年 5 月に発売が開始された 504i シリーズでは、
i モード Java 拡張 API(DoJa)のバージョンアップが行われました。
i アプリの実体は、Java2 Micro Edition(J2ME)の Connected Limited Device Configuration
(CLDC)を基本に、ユーザーインターフェイスや HTTP 通信などの i アプリ独自機能を実現する
ための独自プロファイル i モード Java 拡張 API(DoJa)を実装したものです。i アプリの実行環
携帯電話の固有リソースへのアクセス不可
ダウンロードされた
Javaアプリケーション
JAM
(Java Application Manager)
携帯電話
ストレージ
KVM
iモードJava
メーカー
標準ライブラリ 固有ライブラリ
携帯電話
固有アプリケーション
JAR
ストレージ
相互アクセス
不可
スクラッチパッド
ストレージ
CLDC
クラスライブラリ
ネイティブ アプリケーション インターフェイス
携帯電話OS
図 1-1
i アプリの実行環境
13
Part 1 準備編
境を図 1-1にまとめておきましょう。
i アプリの開発ツールとドキュメントは、NTT ドコモの Web ページで公開されており、また i
アプリ開発環境を構成する Java コンパイラを含む Java2 SDK(JDK)はサンマイクロシステムズ
社から公開されています。つまり、これらをダウンロードしてくれば、誰もが自由に無償で i ア
プリを開発することができます。
i アプリは、図 1-2にあるように HTTP により Web サーバーからダウンロードする形で、i モー
ド Java 携帯電話に保存され、実行することが可能となります。i アプリをダウンロードする Web
サーバーは、NTT ドコモの公式サイトである必要はなく、自前のサーバーやレンタルサーバーで
も i アプリを公開することができます。これにより多くの i アプリが開発され、503i 発売以降1年
足らずで公式/非公式を含め 5,000 本を越える i アプリが公開されています。i モード Java 拡張
API がコンパクトで理解しやすくプログラムサイズが 10K バイトまでと小さかったことなど、日
曜プログラマにも親しみやすい環境であったことが i アプリが普及した原因かもしれません。
携帯電話
サーバー
①
Webブラウザ
HTML
ADF
②
(JAMファイル)
JAM
(Java Application Manager)
③
KVM
JAR
(Javaアプリケーション)
①Webブラウザから、HTTP(HTTPS)プロトコルによりサーバーにアクセス
②HTMLの記述にしたがって、ADF(JAMファイル)が携帯電話にダウンロードされ、
JAM(Java Application Manager)により、JARファイルが実行可能かどうかを判断
③JAMにより、Javaアプリケーション実行ファイルであるJARファイルがダウンロード
され、実行される
図 1-2
i アプリの実行手順
1.2 DoJa プロファイル
J2ME の世界では、i モード Java 携帯電話といった特定の種類の機器で J2ME を動作させるた
めに必要となる API や J2ME 構成の指定をプロファイルと呼びます。プロファイルが同じ機器同
士であれば、同じ Java バイトコードを実行することができます(もちろん Java のソースコード
を書く際に、複数機種への対応を考慮する必要はある)
。
携帯端末用のプロファイルとしては、本家 Java Community Process により定義された Mobile
Information Device Profile(MIDP)があり、au や J-Phone など他キャリアの Java 対応携帯電話
や一部の PDA などで幅広く利用されています。一方、NTT ドコモでは i モード Java 携帯電話で
J2ME を動かすために独自の i モード Java 拡張 API(DoJa)を定義しており、残念ながら両者に
バイナリレベルでの互換性はありません(NTT ドコモの資料では、
「プロファイル」という用語は
使われていないが、実態はプロファイルと同じ)
。プロファイルの位置づけは、図 1-3を見るとよ
14
第 1 章 504i Java はここが変わった
ドコモ503i
シリーズ
機種
固有
API
Car
Profile
TV
ProFile
…
機種
固有
API
DoJa
(iモードJava
拡張API)
Personal Profile
au
J-Phone
au
固有
API
J-Phone
固有
API
Palmなど
MIDP
(Mobile
Information
Device
Profile)
プロファイル
PDA
Profile
デバイスに応じた
固有のAPIを定義
コンフィグレーション
CDC API
CLDC API
JVM
KVM
Connected Device
Configuration
仮想マシン(Virtual Machine)
とデバイスに依存しないコア
APIを定義。CPU性能、メモリ
容量などのデバイス性能により、
大きく2つに区分される
Connected,Limited Device
Configuration
Java2 Micro Editonプラットフォーム
図 1-3 プロファイルの位置づけ
くわかるでしょう。
ただし、両プロファイルとも J2ME の CLDC をベースとしているため、ソースコード上の多く
の部分が流用可能であり、ソースレベルでの互換性はある程度確保されています。プロファイル
で用意されている API の部分を DoJa/MIDP で相互に書き換えることで、比較的簡単にプログ
ラムのポーティングを行うことができるでしょう(なお、図 1-3にもあるように、au や J-Phone
の Java 対応携帯電話では、MIDP に加えてキャリア固有の API も実装されている)。以降の 1.3
節に、主要 API の DoJa と MIDP の対応表を掲載したので、具体的にはそちらをご覧ください。
筆者の印象から言えば、MIDP よりも DoJa プロファイルの方が、平易であり仕様も細かく定
義されており、実装が機器任せになっている個所が少ないため、プログラムがしやすいように思
えます。これは、MIDP が携帯電話や PDA などの幅広い実装を考慮しているのに対し、DoJa が
i モード Java 携帯電話に依存した形で実装されていることに起因していると思われます。
503i シリーズでは、DoJa のバージョンが 1.0 でしたが(以降 DoJa1.0 と記す)
、今回発売された
504i シリーズから上位互換性を維持したバージョンアップが行われ、DoJa のバージョンが 2.0 に
アップデートされています(以降 DoJa2.0 と記す)
。
1.2.1 DoJa1.0 の概要
DoJa1.0 は、携帯 Java 向けの初のプロファイルということもあり、API としては必要最小限と
15
Part 1 準備編
表 1-1 主な DoJa1.0 の API クラス
クラス
機能
IApplication
i アプリの雛型となるクラス
Canvas
低レベル画面表示クラス
Frame
高レベル画面表示クラス
Dialog
ダイアログ表示クラス
Font
表示フォント操作クラス
AudioPresenter
音声データ操作クラス
ShortTimer
短時間タイマー操作クラス
PhoneSystem
i モード Java 携帯電話の機種ごとの固有機能操作クラス
思われる機能のみの実装となっていました。画面表示用のクラスとしては、単純な線、矩形、文
字、イメージ等の描画しかサポートされない「低レベル画面表示クラス」と、テキストボックスや
リストボックス、テキストラベルといった高レベルな GUI インターフェイスが利用できる「高レベ
ル画面表示クラス」
、および「ダイアログ表示専用クラス」の3種類が用意されています(表 1-1)
。
これらのクラスを使用して画面表示を行い、キー入力や GUI インターフェイスの状態変化や指
定時間の経過時に発生するイベントによって、プログラムを動作させるというのが i アプリの基
本構造です。
このほか DoJa1.0 では、HTTP 通信がサポートされており、Web サーバー上のコンテンツを取
得したり、Web サーバー上で動作している CGI プログラムと情報交換を行うことが可能です。
HTTP によってダウンロードしたデータや、プログラムが計算、生成したデータを保存する領
域としてスクラッチパッドと呼ばれる領域が利用可能となっています。スクラッチパッドは、順
編成のごく単純なデータストレージですが、読み書きを行う場所の指定は可能となっています。
スクラッチパッドは、1つの i アプリごとに独立した1つの領域として用意されるため、i アプリ
ソースファイル
javaファイル
各種リソースファイル
gifファイル
iアプリの定義ファイル
ダウンロード用HTML
jamファイル
htmlファイル
mldファイル
コンパイル
クラスファイル
classファイル
アーカイブ
インストールパッケージ
jarファイル
Webサーバーへアップロード
図 1-4
16
i アプリの作成と配布手順
第 1 章 504i Java はここが変わった
間のデータ共有といった目的での使用はできません。さらに1つの i アプリにつき、スクラッチ
パッドのサイズは 10K バイト以下と制限されています。
また、DoJa1.0 では、GIF 画像データや i メロディ(MFi)データを扱うことができます。これら
のデータは先に紹介した HTTP により Web サーバーからダウンロードして入手するほか、i アプ
リのパッケージに同梱することも可能となっています。i アプリはプログラムの実体である Java
バイトコードとともに、必要に応じてこれらのデータを jar(Java Archive)形式でまとめた形で
インストールパッケージを作成し配布します(図 1-4)
。ちなみに、DoJa1.0 では jar ファイルのサ
イズは 10K バイト以下でなければならないという制限があります。
i アプリとして作成した jar ファイルは、先の図 1-2にあるように携帯電話に実装された Java
Application Manager モジュール(以下 JAM と記す)によって管理・実行されます。JAM は、主
に次に示すような機能を提供します。JAM に i アプリの情報(メインクラス名、ファイルサイズ
等)を渡すため、ADF ファイル(拡張子 jam)と呼ばれるテキストファイルを jar ファイルといっ
しょに用意します。
●
i アプリの登録、更新、削除
●
登録済み i アプリのリスト表示
●
登録済み i アプリの実行、強制終了
●
i アプリ実行時のセキュリティ確保
DoJa1.0 レベルの基本的な i アプリの作成方法については、Part2 の3章にて具体的に説明し
ます。
1.2.2 DoJa2.0 の概要
504i シリーズで実装された DoJa2.0 は、これまでの DoJa1.0 に対して、基本的には上位互換と
なっており(一部 DoJa1.0 で端末メーカー依存となっていた部分が定義されているなどがある)、
DoJa1.0 用に書いた Java ソースプログラムはそのままコンパイルして実行が可能です(もちろん、
DoJa1.0 の Java バイトコードをそのまま実行することもできる)
。DoJa2.0 で拡張された API は、
DoJa1.0 の API と明確に区別できるように、次のように分類されています(詳細は、Part4 の i モー
ド Java 拡張 API リファレンス編を参照のこと)。
■
基本 API
DoJa2.0 では、全機種で実装が保証されている API。この API のみを利用して作成した i ア
プリは、504i シリーズであればすべて動作する(DoJa1.0 に対して拡張されている部分も含ま
れるので、503i シリーズでは動作しない可能性もある)
。
■
オプション API
実装されているかどうかが機種によって異なる API。仕様としては確定しているので、実装
されている機種同士であれば互換性がある。
17
Part 1 準備編
■
拡張 API
504i で追加された API。ただし、機種により、API が実装されているかどうかは異なり、か
つ API の挙動も機種ごとに異なる可能性がある。
DoJa2.0 では、先にも述べたとおり DoJa1.0 で端末メーカー実装に任されていた未定部分の仕様
化とともに、以下のような機能拡張が行われています。ただし、依然としてメーカーにより実装
が異なる部分がありますので、プログラムの作成にあたっては、Part4、Part5 を参考にターゲッ
トにする携帯電話の仕様を事前に確認しておく必要があります。
さらに、DoJa2.0 で作成できる jar ファイルのサイズ制限も 10K バイトから 30K バイトに、ス
クラッチパッドのサイズも 10K バイトから 100K バイトにそれぞれ拡張されており、より本格的
でリッチなプログラミングが可能となっています。
●
待ち受けアプリケーションのサポート
●
ネイティブアプリケーション連携のサポート
●
赤外線通信(OBEX)のサポート
●
3D グラフィックスのサポート
●
2D グラフィックスのサポート
●
その他のオプション/拡張 API のサポート
以降で、これらの追加された機能の概要を見ていくことにしましょう。
■ 待ち受けアプリケーション
待ち受けアプリケーションとは、その名のとおり携帯電話が着信待ちの状態で実行する i アプ
リのことです。DoJa1.0 でも i アプリを実行しておき、プログラム中で着信時のイベントをハンド
リングすることで似たようなことはできましたが、この方法では i アプリ実行中は電話をかける
ことができないといった致命的な問題がありました。
待ち受けアプリケーションでは、キー操作を待ち受けアプリケーションに渡すか、携帯電話機
(正確にはネイティブ OS)に渡すかをユーザーが特定のキー操作により切り替えられるようになっ
ています。キー操作が電話機に渡るようにしておけば、待ち受けアプリケーションを実行してい
る間も、普通に電話を発信したり着信したりすることができるわけです。
また DoJa2.0 では、待ち受けアプリケーション実行中はもちろんのこと、通常の i アプリ実行中
もメールやメッセージの受信があると、その旨を示すアイコンが画面に表示されるようになって
おり、ユーザーにリアルタイムで通知されます。さらに、待ち受けアプリケーションでは、実行
状態として活性化状態、非活性化状態、休眠状態の3つの状態が用意されています。アプリケー
ションは、これらの実行状態を制御することで、常時起動している待ち受けアプリケーションに
よる電力消費を抑えることができるように配慮されています。また、実行状態が非活性化状態ま
たは休眠状態の場合、待ち受けアプリの実行を中断してメールやメッセージの受信を行えるよう
になっています。これらの状態遷移を図 1-5に示します。
18
第 1 章 504i Java はここが変わった
待ち受けアプリケーションの起動
非活性化状態
[活性化]ボタン
の押下
プログラム中で
deactivateメソッドを
呼び出す
プログラム中で
Sleepメソッドを
呼び出す
システム
イベント
の発生
活性化状態
休眠状態
[活性化]ボタンの押下
:ユーザーのキー操作は、待ち受けアプリケーションに渡る
:ユーザーのキー操作は、ネイティブアプリケーションに渡る
図 1-5
待ち受けアプリケーションの状態遷移
待ち受けアプリケーションは、それ専用にプログラムを作成する必要があります。ただし、それ
だけでは待ち受けアプリケーションとしては動作しません。携帯電話に待ち受けアプリケーショ
ンをダウンロードした後、携帯電話側で待ち受けアプリケーションとして設定する必要がありま
す。これにより、携帯電話はオンフックボタンなどで待ち受け状態になった時に、登録された待
ち受けアプリケーションを自動的に起動するようになります。
待ち受けアプリケーションの具体的な作成方法については、Part2 の4章で詳しく説明します。
■ ネイティブアプリケーション連携
ネイティブアプリケーション連携とは、i モード Java 携帯電話に内蔵されているブラウザやメー
ルリーダ、赤外線ポートなどを使って指定した i アプリを起動したり、逆に i アプリからブラウザ
やダイヤラーを起動したりすることです。
DoJa1.0 では、セキュリティ面での配慮から、ネイティブアプリケーションとの連携は一切でき
ませんでしたが、DoJa2.0 からは次の連携が可能になっています。ただし、従来と同様にアドレス
帳などのネイティブアプリケーションとは連携ができませんので、アドレス帳と連動するような
i アプリは作れません(Part3 でアドレス帳とデータ交換を行える i アプリは紹介している)。
●
ブラウザから i アプリを起動
●
メールから i アプリを起動
●
外部機器(赤外線ポート)から i アプリを起動
●
i アプリからブラウザを起動
●
i アプリから音声発信機能(ダイヤラー)を起動
ネイティブアプリケーションからの i アプリの起動は、すでにダウンロード済みの i アプリの起
動を意味します。この起動のきっかけとなるのは、以下に示すようなイベントです。これらのイ
ベント発生時に、起動したい i アプリを指定する ADF ファイルを送信することで目的の i アプリ
19
Part 1 準備編
を起動するようになっています。
●
Web ページ上のリンクのクリック
●
指定フォーマットの受信メールの該当箇所をクリック
●
指定フォーマットの赤外線ポートからのデータの受信
一方、i アプリからのネイティブアプリケーションの起動は、起動するネイティブアプリケー
ションごとに API が用意されているので、それらを使って行います。ブラウザの起動ではパラ
メータとして URL を指定することで、任意の Web ページ(i アプリをダウンロードしたサイトで
なくてもよい)をアクセスすることが可能です。ダイヤラーではパラメータとして電話番号を指
定することで、その番号に電話をかけることができるようになっています。この機能を使えば、i
アプリでエラーが発生した場合、サポートセンターに電話をかけるといったことにも使えます。
いずれの連携も、
「i アプリを起動していいか」
「Web ページを表示していいか」
「電話をかけて
いいか」といった旨のダイアログが開き、ユーザーに可否を問い合わせるようになっているので、
完全自動で i アプリの実行を行ったり、電話の発信をすることはできません。
ネイティブアプリケーションとの連携については、Part2 の 8 章で詳しく説明します。
ネイティブ OS とネイティブアプリケーション
DoJa2.0 では、i モード Java 携帯電話に内蔵されたブラウザやメールリーダを通常の PC と同じようにア
プリケーションとして実装しています(次の図を参照)
。これらのアプリケーションを「i アプリ」に対して「ネ
イティブアプリケーション」と呼び区別しています。
本文ではネイティブアプリケーションとして、Web ブラウザ、メールリーダ、赤外線ポート、ダイヤラーが
i アプリとの連携を行うものとして紹介していますが、これら以外にも i アプリを実行するための環境(JAM)
も1つのネイティブアプリケーションとして実装されています。また、これらネイティブアプリケーションの
実行や管理を行うために OS が用意されており、これを「ネイティブ OS」と呼びます。
iアプリ
iアプリ
Webブラウザ
メールリーダ
赤外線ポート
ダイヤラー
JAM
(ネイティブアプリ
(ネイティブアプリ
(ネイティブアプリ
(ネイティブアプリ
(ネイティブアプリ
ケーション) ケーション) ケーション) ケーション) ケーション)
ネイティブOS
携帯電話ハードウェア
■ 赤外線通信(OBEX)
DoJa2.0 では、赤外線ポートを使用した外部機器との接続を OBEX 外部接続機能として標準で
サポートしています。503i シリーズでは一部の機種にしか赤外線ポートは搭載されていませんで
したが、504i シリーズでは全機種に赤外線ポートが搭載されています。
20
第 1 章 504i Java はここが変わった
OBEX とは Object Exchange の略で、1997 年に米 Extended Systems 社が仕様書を起草した
規格です。その名の示すとおりさまざまなオブジェクト(バイナリデータと言ってもよいかもし
れない)の交換を行うためのトランスポート層のプロトコルで、アドホックな無線通信に最適化し
たものです。DoJa2.0 では IrDA という赤外線通信上に OBEX を実装しています。Windows2000
や PocketPC 2002、Palm 等でも IrDA 上の OBEX をサポートしており、504i 同士はもちろんの
こと、これらの機器との情報交換も可能です。
DoJa2.0 では OBEX を使用して1回に送受信できるオブジェクトのサイズを 30K バイトまでと
制限しています。また、IrDA の規格としては通信距離 20cm 程度、ボーレートは 9,600bps また
は 38,400bps となっています。
OBEX プロトコルは、クライアント/サーバーモデルのプロトコルです。DoJa2.0 では OBEX
クライアントはもちろん OBEX サーバーとしての機能を実現するインターフェイスが用意されて
いますので、携帯電話同士で OBEX プロトコルを使った IrDA による直接通信も可能です。
■
OBEX プロトコルを実装するために DoJa2.0 に実装されたインターフェイス
●
ServerObexConnection インターフェイス
●
ClientObexConnection インターフェイス
DoJa2.0 では、OBEX プロトコルを HTTP 通信やスクラッチパッドの入出力と同様に Generic
Connection フレームワーク上に構築しています。先に記述した Window2000、PocketPC 2002 や
Palm といった各種機器との通信も含め、赤外線通信については、Part2 の5章で説明します。
■ 2D/3D グラフィックスのサポート
DoJa2.0 では、基本的にすべての DoJa2.0 対応 Java 携帯電話でサポートされている基本 API の
ほかに、機種によってサポートされる「オプション API」と、各 API をさらにメーカーごとに機
能拡張した「拡張 API」が定義されているというのは、先に述べたとおりです(Part4 のリファレ
ンス編を参照のこと)。ここで紹介する 2D/3D グラフィックスのサポート API は、すべてオプ
ション API および拡張 API にあたる機能として実装されています。
2D グラフィックスは、従来の低レベルのグラフィック描画やイメージ処理を拡張するもので、
表 1-2、表 1-3のような機能が用意されています。
一方の 3D グラフィックスは、3D モデルデータやモデルのアクション(時間ごとのモデルのポー
ズデータ)を設定することで、画面上に3次元のアニメーション表示を行うものです。3D グラ
フィックスの API は、高レベル 3D グラフィック描画と低レベル 3D グラフィック描画の2種類
が用意されています(ただし、これらの混在はできない)。いずれも拡張 API となっており、3D
モデルデータのフォーマットはメーカー依存となっています(表 1-4)。
3D グラフィックスの処理には、実数演算が不可欠ですが、CLDC では整数演算しかサポートさ
れていません。このため、DoJa2.0 では擬似的に実数を扱うための独自の単位系を導入していま
す。これにより、これらの拡張 API では実数演算がサポートされるほか、高レベル 3D グラフィッ
ク描画 API ではアフィン変換や 3 次元ベクトル演算もサポートされています。
21
Part 1 準備編
表 1-2
2D グラフィックス(オプション API)
機能
詳細
イメージマップ
小さなイメージを縦横に並べて大きなイメージを作成する。小さなイメージは配列と
して複数を登録でき、どれをどの場所に描画するかを指定できる
ズーム座標系
画面描画の際の座標系を縦横 256 倍にした座標系を使用することで、ズームや表示位
置の指定を可能とする
スプライト
複数の画像の前後関係から、後ろにある画像は前にある画像の影に隠れるといった処
理を行う。また、そのほかにも画像の可視/非可視の切り替えや、画像の反転/回転、
画像同士の衝突判定などが行える
ピクセル操作
指定した位置のピクセルの読み込み、書き込みを実現する
透明色付きイメージ
イメージデータ中の指定した色の部分を透明色として描画する
パレット付きイメージ
イメージデータ中の色パレットの状態の読み込み、書き込みを実現する
イメージの回転/反転
/縮小拡大表示
イメージデータの X 軸、Y 軸についての反転、180 度の回転、幅/高さ指定の縮小/
拡大を実現する
描画クリッピング
描画の際に描画領域を矩形で指定することでクリッピングを実現する
ラスタオペレーション
描画の際にラスタオペレーションとして、加算、置換え、減算などを指定可能とする
イメージのコピー
描画領域の矩形で指定した領域を指定した距離離れた場所にコピーする
アニメーション GIF の
指定フレームの描画
アニメーション GIF データの指定したフレームの画像データを指定位置に描画する
数値の描画
int 型の数値データを指定桁が納まるように右詰めで描画する
描画領域からの
イメージ生成
描画領域の矩形で指定した領域をイメージデータとして生成する
2色の中間色の取得
2つの色の中間色を計算する
表 1-3
2D グラフィック(拡張 API)
機能
詳細
アニメーション再生
アニメーション GIF 以外の高効率なアニメーションデータの再生を実現する。使用
できるアニメーションデータのフォーマットは、メーカーに依存する
表 1-4
3D グラフィック(拡張 API)
機能
詳細
高レベル
3D グラフィック描画
3D グラフィックスデータを扱うための基本的な API を提供
低レベル
3D グラフィック描画
高レベル API に加え、より高度な描画制御を行うための API を提供
これらの 2D/3D のグラフィックスについては、Part2 の6章で詳しく説明します。
■ その他のオプション API/拡張 API のサポート
2D/3D グラフィックスのほかにも、DoJa2.0 にはオプション API や拡張 API として機能強化
されている API が用意されています(表 1-5、表 1-6、表 1-7、表 1-8)
。これらのうち、サウン
ド関係については、Part2 の7章で、それ以外のものについては、Part2 の8章で説明します。
22
第 1 章 504i Java はここが変わった
表 1-5
サウンド関係
機能
詳細
MFi/Phrase
複数のサウンドデータを最大4つまで同時に再生させる機能。携帯電話の持つ音源
のチャンネル数を複数の仮想的なトラックとして使用することで実現している
一時停止/再開
サウンドデータ再生の際に、一時停止、再開をサポートした
エフェクト
サウンドデータ再生時に、キーシフト、パンポット、テンポ、ボリュームなど指定
が可能となったほか、再生回数(ループ回数)を指定できるようになった
再生時間制御
サウントデータ再生時に、再生を開始する位置の指定が可能となった
再生同期イベント
サウンドデータの指定したチャンネルの指定したノートメッセージを再生させるこ
とで、それを同期用のイベントとして利用できるようになった
表 1-6
リソース関係
機能
詳細
音量制御
メロディの再生音量、イヤホンマイクのマイク音量、組み込み効果音の再生音量の
取得/設定が可能となった
折りたたみ開閉状態取得
折りたたみの電話機の開閉状態やフリップの開閉状態が取得可能となった
ソフトキーの背景色制御
ソフトキー表示エリアの背景色の取得/設定が可能となった
追加キー制御
ページアップ、ページダウンキーや8方向サポートのカーソルキーをサポートした
バイブレータ制御
バイブレータのオンオフの制御をサポートした(以前もあったが、メーカー固有の
機能として実装されていた)
背面液晶
イルミネーション制御
背面液晶のバックライトの点灯色の設定が可能となった
背面ライト制御
背面の i モードマークのライト点灯色の設定が可能となった
メモ液晶制御
メモ液晶のバックライトの点灯色の取得/設定が可能となった
明度/コントラスト制御
メインディスプレイ、サブディスプレイの明度/コントラストの状態の取得や設定
が可能となった
組み込み効果音再生
アラーム通知、処理受付通知、エラー通知、情報通知、警告通知の5つの通知音を
再生する
表 1-7
サブディスプレイ関係
機能
詳細
サブディスプレイの
デバイス情報取得
サブディスプレイの幅/高さ、カラーか否か、使用可能色数などの情報を取得する
サブディスプレイ
への描画
指定したイメージデータをサブディスプレイに描画する
表 1-8
ネイティブデータストレージアクセス関係
機能
詳細
待ち受け画像保存領域へ
のアクセス
イメージデータを待ち受け画像保存領域に保存する
3D キャラクタ保存領域
へのアクセス
バイト配列を 3D キャラクタデータとして 3D キャラクタ保存領域に保存する
23
4章
待ち受けアプリケーション
この章では、504i の新機能である待ち受けアプリの作成方法を解説します。4.1 節では待ち受け
アプリとはどういったもので、通常の i アプリとどのように異なるのかを説明し、その取りうる
状態や待ち受けアプリ特有のイベントについて解説します。4.2 節では簡単な待ち受けアプリの作
成を例にとって、待ち受けアプリのコーディング方法や注意点を具体的に解説します。最後の 4.3
節では、作成した待ち受けアプリをエミュレータでチェックする方法を取り上げます。
4.1 待ち受けアプリの概要と状態遷移
503i においては、i アプリとはあくまでも一時的に起動し動作させるだけのものです。このた
め、Java を用いて携帯電話機の待ち受け画面を制御し、キャラクタが動いている画面にすると
いったことは想定されていませんでした。i アプリを常に起動させておくことにより、i アプリを
待ち受け的な目的に使用し、動きのある待ち受け画面を作成することは不可能ではありませんが、
このようなやり方での擬似的待ち受けアプリでは、次のような問題が生じます。
●
待ち受け中にキー入力を受け付けない
電話をかけたいといった場合には、一度 i アプリを終了して電話をかけ、その後再度 i アプリ
を起動し直すという手順が必要となり、面倒である
●
時計が見えなくなる
通常の待ち受け画面と違って、時計が表示されず、携帯を時計代わりに使うには不便
●
電力を消費する
常に i アプリを動作させておくため、電力消費が激しい
●
メールが届いても着信通知が表示されない
i アプリ実行中は、i アプリの動作が最優先になるので、メールが到着しても画面に表示され
ず、i アプリを終了しないかぎりメールが届いているかどうかがわからない
58
第 4 章 待ち受けアプリケーション
4.1.1 待ち受けアプリの3つの状態
504i では、こういった問題点を解決するために「待ち受けアプリ」という新機能が追加されてお
り、i アプリが待ち受けらしくきちんと動作することが可能になっています。待ち受けアプリにお
いては、従来型の i アプリの動作状態と同様な活性化状態に加えて、待ち受け状態である非活性化
状態と、省電力状態である休眠状態の3つの状態をとることができ、これらを適宜切り替えるこ
とによって上記の問題が解決されています。これらの状態での動作は、以下のようになります。
■
活性化状態
通常の i アプリを起動した時と同じ状態(503i における i アプリは常にこの状態のみ)。活性化
状態でのキー入力は i アプリが受け取るので、電話をかけることはできない(電話の着信は可
能)
。メールの着信の際には画面上に通知が出るが、画面の一部に小さく表示されるだけで、着
信音などは出ないため、503i より改善はしているものの依然としてメール着信に気がつきやす
いとは言えない。また、画面上に時計は表示されない。
■
非活性化状態
待ち受け状態。待ち受け画面と同様の状態で、画面はアプリ側で制御できるが、キー入力は携
帯電話機のネイティブ OS が受け取るため、電話をかけたり各種設定を行ったりできる。メー
ルの着信なども、通常の待ち受け状態と同様に音声や画面で通知される。画面上には自動的に
時計が表示され、ソフトキーラベルは非表示になる(時計に関しては、機種によって待ち受け
アプリが起動している場合のみ非表示設定にすることも可能)。
■
休眠状態
電力を消費しないように動作が停止している状態。画像の書き換え等はいっさい行われない。
タイマーやプレゼンタは休眠状態に入ると停止し、その後非活性化状態になっても自動では再
開しない。Ticker は休眠状態では停止し、その後非活性化状態になると動作を再開する。
携帯電話機の電源をオンにすると、待ち受けアプリを起動する確認画面が出た後で待ち受けア
プリが起動され、まず非活性化状態になります。ユーザーは、各携帯電話機で指定された操作に
したがって、アプリを活性化状態にすることができます(通常は
活性化
ボタンとして割り当てられ
たキーを押す、もしくは特定キーを長押しする)
。
活性化状態にあるアプリを非活性化状態にしたり、非活性化状態にあるアプリを休眠状態にす
ることは、アプリを作成するプログラマ側で、適切なタイミングで行うようにコーディングしな
ければなりません。通常では、アプリを終了するボタンを押すと活性化状態から非活性化状態に
移行させ、非活性化状態で一定時間キー操作がないか携帯電話機が折りたたみ状態になったとき
に休眠状態に移行するようにプログラミングします(なお、携帯電話機では一定時間キー入力が
ないと自動的に画面が暗くなるようになっているが、これは休眠状態とは関係ない)。
休眠状態から非活性化状態に移行する作業は、携帯電話機側のネイティブ OS がキー操作があっ
たときなどを捕らえて自動的に移行処理をしますので、プログラマ側は何もする必要がありま
59
Part 2 開発編
活性化状態
非活性化状態
休眠状態
①活性化状態へ移行
④非活性化状態へ移行
②非活性化状態へ移行
③休眠状態へ移行
キー操作でミサイルを打つなど、
ゲームで遊ぶことができる
キー入力を受け付けないので
ゲームでは遊べないが、
デモ画面が
流れていて、画面には動きがある。
時刻が自動的に表示される
図 4-1
画面はいっさい動かず、休眠状態に
移行した時のままで止まっている。
電力消費が押さえられている状態
待ち受けアプリの状態遷移
せん。
待ち受けのゲームアプリを例として、具体的にこれらの状態遷移の状況を図 4-1に図示してみ
ましょう。
ゲームセンターのゲームにたとえて言うならば、活性化状態はコインを入れて実際にゲームが
できる状態であり、非活性化状態はゲームが終了してデモ画面が流れておりレバーを操作しても
何もできない状態です。さらに、休眠状態は誰もゲーム機のレバーをいじらないのでスクリーン
セイバーが動作して画面が真っ黒になっている状態と思ってもらえればわかりやすいでしょう。
そして、図 4-1における各状態間の遷移は、
「
を入れることに相当し、
「
2
1
活性化状態へ移行」はゲームをする人がコイン
非活性化状態へ移行」はゲームオーバーに相当します。
「
3
休眠状態
へ移行」はゲームのキー操作がまったくないためゲーム側で画面を暗くする動作に対応し、
「
4
非
活性化状態へ移行」はゲームのレバー操作をゲーム機が感知してデモ画面を表示させる動作に対
応します。
このなかでゲームのプログラマが処理しないといけないのは、
「
眠状態へ移行」の部分であり、
「
「
4
1
2
非活性化状態へ移行」
「
3
休
活性化状態へ移行」はゲームのプレイヤー側によってなされ、
非活性化状態へ移行」はゲーム機の OS が処理する事柄です。これと同様に携帯電話機でも、i
アプリのプログラマが処理しなければならないのは、
2
非活性化状態へ移行
3
休眠状態へ移行
の部分で、
「
1
活性化状態へ移行」は i アプリを利用するユーザーが携帯電話機を操作して行う(実
際の操作手順は電話機ごとに異なる)ものであり、
「
4
非活性化状態へ移行」は携帯電話機の側で
自動的に処理されます。
なお、待ち受けアプリがどの状態にあっても、電話の着信があったときは自動的に待ち受けア
プリが中断状態となり、作業終了後にアプリの動作が再開されます。また、i モードを起動した
60
第 4 章 待ち受けアプリケーション
り、ユーザーがアプリの強制終了をしたときには、待ち受けアプリはいったん終了し、操作終了
後に自動的に再起動され、非活性化状態になります*1 。
ちなみに、i アプリが現在どの状態にあるかを知るには、携帯電話機の画面上に表示されている
「i アプリマーク」
(αの形をしている)で確認できます(図 4-2)
。これが点滅していれば活性化状
態であり、点滅せずにαが表示されていれば非活性化状態です。休眠状態ではαの表示は非活性
化状態と同じですが、画面の更新がまったくなされなくなります。
活性化状態
(αマークが点滅)
図 4-2
非活性化状態
i アプリマークの点滅状態
4.1.2 待ち受けアプリのシステムイベント
上記に加えて、待ち受けアプリではシステムイベントの処理が可能です。システムイベントを
用いると、以下のイベントを捕らえることができ、イベント発生時のタイミングで特定のアクショ
ンを起こすなどの用途に活用できます。
●
指定した時間が経過したときに呼ばれるウェイクアップタイマーイベント
休眠状態への移行後に、一定時間が経過すると非活性化状態に復帰するといった用途に使える
●
毎分正時(00 秒)に呼び出される時計イベント
アラーム機能などを持たせて、毎分正時に処理するときに役立つ。通常のタイマー機能を用
いて、たとえば 30 秒おきにアラームを鳴らすかどうかを確認するといったやり方では、00 秒
から 30 秒の間のどこかでアラームが鳴るようにしかできないが、時計イベントを用いれば
ちょうど 00 秒にアラームを鳴らすことが可能になる
●
活性化状態に移行したことを表すモード変化イベント
●
折りたたみ状態が変化したことを表す折りたたみ変化イベント
*1 どういったタイミングで中断や一時終了が生じるかは、NTT ドコモの「504i 向けアプリ開発ガイド」に記述
されているが、実機の動作は必ずしも仕様どおりでない場合がある。
61
Part 2 開発編
通常のタイマークラスなどを用いたコーディングでは、休眠状態に移行したときにタイマーは動
作を停止しますが、システムイベントは待ち受けアプリがどのような状態にあっても発生するの
で、アラーム機能などを持たせるときには必ずこのシステムイベントを用いなければなりません。
なお、待ち受けアプリは、通常の i アプリとして起動することも可能ですが、その場合これら
の待ち受けアプリ特有の機能は使用できなくなります。
4.2 待ち受けアプリのプログラム例
この節では、ステップを追いながら、シンプルな待ち受けアプリを作成していきましょう。こ
のプログラムは、待ち受けアプリの雛形としても使えるはずです。また、最後に作成上の注意点
もまとめておきます。
4.2.1 MApplication で追加されたメソッド
通常の i アプリを作成するときには IApplication を継承しますが、待ち受けアプリを作成する
時には「MApplication」を継承します。MApplication には、IApplication の機能に加えて、表 4-1
と表 4-2のメソッドが用意されています。
ただし、これらのメソッドはアプリが待ち受けアプリとして動作している場合のみに実行可能
であり、たとえ MApplication を継承して作成したアプリでも、ユーザーが通常の i アプリとして
表 4-1
MApplication に追加されたメソッド 1 −状態を遷移させるメソッド
メソッド
詳細
deactivate()
活性化状態にあるアプリを非活性化状態にする。待ち受けアプリが活性化状態にないときは
何もしない
sleep()
非活性化状態にあるアプリを休眠状態にする。このメソッドは必ず非活性化状態で呼ばれね
ばならない。活性化状態でこのメソッドを呼ぶと IllegalStateException 例外が生じる。
待ち受けアプリケーションの起動
[活性化]ボタン
の押下
非活性化状態
プログラム中で
deactivateメソッドを
呼び出す
プログラム中で
Sleepメソッドを
呼び出す
システム
イベント
の発生
活性化状態
休眠状態
[活性化]ボタンの押下
:ユーザーのキー操作は、待ち受けアプリケーションに渡る
:ユーザーのキー操作は、ネイティブアプリケーションに渡る
図 4-3 待ち受けアプリの状態遷移とメソッド
62
第 4 章 待ち受けアプリケーション
表 4-2
MApplication に追加されたメソッド 2 −システムイベントを制御するメソッド
メソッド
詳細
processSystemEvent()
システムイベントを受けるハンドラメソッド
setWakeUpTimer()
ウェイクアップタイマーを開始する
getWakeUpTimer()
ウェイクアップタイマーの残り時間を取得する
resetWakeUpTimer()
ウェイクアップタイマーを停止する
setClockTick()
時計イベントの発生を開始/停止する
起動したときには実行できません。通常の i アプリとして起動された場合にこれらのメソッドが
呼ばれると IllegalStateException 例外が発生します。
4.2.2 最も簡単な待ち受けアプリ
それでは、待ち受けアプリを実際に作成しながら、これらのメソッドをどのように使用するか
を見ていきましょう。ここでは、最も簡単な待ち受けアプリとして、図 4-4に示した雪だるまが
動くアプリを取り上げます。このアプリは、以下のようなアプリで、活性化状態では
ソフトキー 1
の
終了ボタンを押すと非活性化状態に移行し、電話機が折りたたまれると休眠状態に移行するとい
うものです。
●
活性化状態では雪だるまが左から右に動き、
数字
キーの操作によって雪だるまを上下に
移動させることができる
●
非活性化状態では、キー操作によって雪だるまを上下に移動させることはできないが、雪
だるまは画面上を右方向に移動する
●
休眠状態では何の動作もしない
図 4-4 サンプルプログラムの実行画面
これ自体はあくまでもサンプルプログラムですので実用性はありませんが、きちんとしたキャ
ラクタと背景を付けて、多少のゲーム性を持たせれば、ある程度実用的な待ち受けアプリになる
63
Part 2 開発編
でしょう。
まず、待ち受けアプリの核心である、状態の切り替えを扱うコードを作成します。リスト 4-1
に、活性化状態を非活性化状態にするコードを示します。
リスト 4-1
Sample4-1
import com.nttdocomo.ui.*;
public class snowman extends MApplication implements SoftKeyListener{
Panel mainPanel;
public void start() {
mainPanel=new Panel();
mainPanel.setSoftLabel(Frame.SOFT_KEY_1,"終了");
mainPanel.setSoftKeyListener(this);
Display.setCurrent(mainPanel);
}
…1
public void softKeyPressed(int softKey){
}
public void softKeyReleased(int softKey){
if (softKey==Frame.SOFT_KEY_1) {
…2
deactivate();
}
}
}
1
で MApplication を継承して snowman クラスを作っています。start() メソッドでは Panel
を作成し、ソフトキー関係の設定をしています。
2
は
ソフトキー 1
が離された時の処理で、ここに
deactivate() を書いてアプリを非活性化状態にしています。
ここで
ソフトキー 1
には「終了」と表示していますが、通常の i アプリのように terminate() メソッ
ドを呼び出してはいけません。terminate を呼び出すと待ち受けアプリ自体が終了してしまいま
す。基本的に待ち受けアプリは終了することはなく、
「終了」というのはあくまでも活性化状態が
終了するというだけのことなので、terminate ではなく deactivate を呼び出すことになります。
次に、電話機が折りたたまれたときに休眠状態にするコードを付加したものをリスト 4-2に示
します。
リスト 4-2
Sample4-2
import com.nttdocomo.ui.*;
public class snowman extends MApplication implements SoftKeyListener{
Panel mainPanel;
public void start() {
mainPanel=new Panel();
mainPanel.setSoftLabel(Frame.SOFT_KEY_1,"終了");
mainPanel.setSoftKeyListener(this);
Display.setCurrent(mainPanel);
}
64
第 4 章 待ち受けアプリケーション
//折りたたみ状態を検知するシステムイベントハンドラ
public void processSystemEvent(int type, int param) {
if (type==MApplication.FOLD_CHANGED_EVENT) {
if (param==0){ //電話機を閉じたとき
deactivate();
…3
sleep();
}
}
}
public void softKeyPressed(int softKey){
}
public void softKeyReleased(int softKey){
if (softKey==Frame.SOFT_KEY_1) {
deactivate();
}
}
網掛けの部分が追加したコードで、ここでシステムイベントを捕らえています。processSyste
mEvent は int 型の引数を 2 つ持ち、第 1 引数がイベントの種類を表し、第 2 引数がそのイベント
ごとに決められた詳細を表すパラメータです。
この場合、第 1 引数が「MApplication.FOLD_CHANGED_EVENT」であれば電話機の折りたた
み状態が変化したことが分かり、さらに第 2 引数が「0」であれば折りたたまれたことが、
「1」であ
れば開かれたことが分かります。したがって、
3
の位置に deactivate() と sleep() を書いて、電話
機が折りたたまれたときに休眠状態に入るようにしています。sleep() だけでなく deactivate() も
呼び出しているのは、活性化状態で電話機を閉じることもあり得るためで、確実に非活性化状態
にしてから休眠状態にしています。
4.2.3 待ち受けアプリに時刻を表示する
次に、この待ち受けアプリでは画面に時刻が表示されないので、活性化状態で時刻を表示する
ように改良してみましょう。リスト 4-3にコードを示します。
リスト 4-3
Sample4-3
import java.util.*;
import com.nttdocomo.ui.*;
public class snowman extends MApplication implements SoftKeyListener{
Panel mainPanel;
public void start() {
mainPanel=new Panel();
mainPanel.setSoftLabel(Frame.SOFT_KEY_1,"終了");
mainPanel.setSoftKeyListener(this);
mainPanel.setTitle("");
65
Part 2 開発編
Display.setCurrent(mainPanel);
}
//システムイベントハンドラ
public void processSystemEvent(int type, int param) {
if (type==MApplication.FOLD_CHANGED_EVENT) {
//折りたたみ状態の変化を検知
if (param==0){//電話機を閉じたとき
deactivate();
sleep();
}
} else if (type==MApplication.CLOCK_TICK_EVENT) {
//時計イベントが呼ばれたとき
//現在時刻を表示
showNow(); … 5
} else if (type==MApplication.MODE_CHANGED_EVENT) {
//活性化状態になったとき
setClockTick(true); … 4
showNow();
}
}
public void softKeyPressed(int softKey){
}
public void softKeyReleased(int softKey){
if (softKey==Frame.SOFT_KEY_1) {
//非活性化状態にする
setClockTick(false);//時計イベントを無効にする … 6
mainPanel.setTitle("");//時刻表示が二重にならないようにする
deactivate();
}
}
private void showNow() {
//現在の時刻を表示する
Calendar ca;
ca=Calendar.getInstance();
ca.setTime(new Date());
mainPanel.setTitle(ca.get(Calendar.HOUR_OF_DAY)+":"+ca.get(Calendar.MINUTE));
}
}
非活性化状態では、時計を非表示にしていないかぎり自動的に時刻表示がされるので、時刻表示は
必要ありません。活性化状態かどうかを識別するために、システムイベントの
「MODE_CHANGED_
EVENT」を捕らえます。これはアプリが活性化状態になったときに呼ばれるイベントであり、こ
のイベントが捕らえられてから deactivate() メソッドを呼ぶまでの間が活性化状態であると判断
できます。
4
の箇所でこのイベントを捕らえて、setClockTick() メソッドを用いて時計イベントを有効にして
います。これによって毎分 00 秒に時計イベントが生じますので、5 の箇所で CLOCK_TICK_EVENT
66
第 4 章 待ち受けアプリケーション
を捕らえて時刻を表示します。なお、活性化状態になってから次の 00 秒までの間も時刻が表示さ
れるように、MODE_CHANGED_EVENT を捕らえた
す。アプリを非活性化状態にする
6
4
の直後の箇所でも時刻表示を行っていま
の箇所で、時計イベントが通知されないようにして、時刻表
示を消しています。
4.2.4 待ち受けアプリが通常起動されたときの対応
ここまで用いてきたシステムイベントは、待ち受けアプリが通常の i アプリとして起動されたと
きには使えません。通常の i アプリとして起動されたときにも時刻表示をしたければ、start() メ
ソッド内で以下のように、getLaunchType() を用いて待ち受け状態と通常の起動を分岐して、通
常の起動の場合にはタイマーをスタートさせて時刻を得るといった処理をする必要があります(た
だし、毎分 00 秒に時刻が更新されるとは限らなくなる)。
if (getLaunchType() == LAUNCHED_AS_CONCIERGE ) {
// 待 ち 受 け ア プ リ と し て 起 動 さ れ た と き の 処 理
} else {
// 通 常 の ア プ リ と し て 起 動 さ れ た と き の 処 理
}
特に、MApplication 固有の処理である deactivate() などを呼ぶ処理をしている箇所が、通常起
動された場合にも実行される可能性がある場合には、このようにして待ち受けアプリである場合
の処理だけを分けておかないと、通常の i アプリとして起動されたときに例外が生じて動作しな
くなってしまいます。たとえば待ち受けアプリにおける終了ボタンは、以下のように記述する必
要があります。
if (getLaunchType()==LAUNCHED_AS_CONCIERGE ) {
deactivate();
} else {
terminate();
}
4.2.5 待ち受けアプリの完成版
ここまでで待ち受けアプリ特有の処理が終わったので、あとは雪だるまを動かす処理を書きま
す。リスト 4-4にコードを示します。
雪だるまを動かすのは通常の i アプリとほとんど変わりませんが、タイマー処理に関しては注意
が必要です。休眠状態に入って、その後非活性化状態や活性化状態に復帰するときにタイマーは
自動では再開されません。休眠状態からの復帰後には sleep() メソッドの続きから実行されますの
で、sleep() メソッドの直後にタイマーを再開するコードを書かなければなりません。リスト 4-4
の
7
にこの処理が記述されています。
67
Part 2 開発編
リスト 4-4
snowman.java
//
//
Copyright (c) 石井 充裕
//
import java.util.*;
import com.nttdocomo.ui.*;
import com.nttdocomo.io.*;
import com.nttdocomo.util.*;
public class snowman extends MApplication
implements SoftKeyListener, TimerListener, KeyListener{
Panel mainPanel;
ImageLabel imglbl;
Timer t;
int snowmanX, snowmanY, snowmanWidth, snowmanHeight, panelWidth, panelHeight;
public void start() {
mainPanel=new Panel();
mainPanel.setSoftLabel(Frame.SOFT_KEY_1,"終了");
mainPanel.setSoftKeyListener(this);
mainPanel.setKeyListener(this);
mainPanel.setTitle("");
MediaImage img = MediaManager.getImage("resource:///snowman.gif");
try {
img.use();
imglbl = new ImageLabel(img.getImage());
snowmanWidth=imglbl.getWidth();
snowmanHeight=imglbl.getHeight();
imglbl.setSize(snowmanWidth,snowmanHeight);
mainPanel.add(imglbl);
} catch (ConnectionException ce) {}
panelWidth=mainPanel.getWidth();
panelHeight=mainPanel.getHeight();
snowmanX=0; snowmanY=panelWidth/2;
mainPanel.setLayoutManager(null);
imglbl.setLocation(snowmanX, snowmanY);
t= new Timer();
t.setListener(this);
t.setRepeat(true);
t.setTime(300);
t.start();
Display.setCurrent(mainPanel);
}
//システムイベントハンドラ
public void processSystemEvent(int type, int param) {
if (type==MApplication.FOLD_CHANGED_EVENT) {
//折りたたみ状態の変化を検知
if (param==0){//電話機を閉じたとき
mainPanel.setTitle("");
deactivate();
sleep();
if (t!=null) t.start();//休眠状態終了の時の措置 … 7
}
68
第 4 章 待ち受けアプリケーション
} else if (type==MApplication.CLOCK_TICK_EVENT) {
//時計イベントが呼ばれたとき
//現在時刻を表示
showNow();
} else if (type==MApplication.MODE_CHANGED_EVENT) {
//活性化状態になったとき
setClockTick(true);
showNow();
}
}
public void resume(){//電話着信があったりして中断後にタイマーを再開する
if (t!=null) t.start();
}
public void timerExpired(Timer source) {//タイマーのイベントハンドラ
snowmanX+=10;
if (snowmanX>panelWidth) snowmanX=-snowmanWidth;
imglbl.setLocation(snowmanX, snowmanY);
}
public void softKeyPressed(int softKey){
}
public void softKeyReleased(int softKey){
if (softKey==Frame.SOFT_KEY_1) {
if (getLaunchType()==LAUNCHED_AS_CONCIERGE ) {
//非活性化状態にする
setClockTick(false);//時計イベントを無効にする
mainPanel.setTitle("");//時刻表示が二重にならないようにする
deactivate();
}else terminate();
}
}
public void keyPressed(Panel panel, int key) {
}
public void keyReleased(Panel panel, int key){
if (key==Display.KEY_2) {
snowmanY-=3;
if (snowmanY<0) snowmanY=0;
} else if (key==Display.KEY_8) {
snowmanY+=3;
if (snowmanY>panelHeight) snowmanY=panelHeight;
} else if (key==Display.KEY_5) {
mainPanel.setTitle("");
deactivate();
sleep();//実機で休眠状態を確認するためのもの
if (t!=null) t.start();//休眠状態終了の時の措置 … 7
}
}
69
Part 2 開発編
private void showNow() {
//現在の時刻を表示する
Calendar ca;
ca=Calendar.getInstance();
ca.setTime(new Date());
mainPanel.setTitle(ca.get(Calendar.HOUR_OF_DAY)+":"+ca.get(Calendar.MINUTE));
}
}
なお、この雪だるまアプリでは、電話機が折りたたまれた時に加えて、活性化状態で
5
キーを
押しても休眠状態に入るようにしています。これは、休眠状態に入ったときに動作が停止するこ
とがはっきり分かるようにしてあるだけですので、実際に待ち受けアプリを作成するときには、
電話機が折りたたまれた場合だけ休眠状態に移行するようにするのが現実的でしょう。
ここで、休眠状態にあるときにキー操作をすると、休眠状態からの復帰に加えて resume() メ
ソッドも同時に呼ばれ、機種によってはタイマーの再開(t.start())が二重に呼ばれてエラーにな
ります。これは携帯電話機における Java の実装上、折りたたまれた時以外に休眠状態に入ること
を想定していないということであり、実装の甘い箇所ではありますが、機種に関係なく動作させ
たい場合には、折りたたまれた時のみ休眠状態に入るようにするか、タイマーを使わずにスレッ
ドを使うことになります。
リスト 4-1のコードをベースにした待ち受けアプリの事例をもう1つ示しておきましょう
(図 4-5)
。リストは掲載していませんが、付属 CD-ROM に含まれていますので
[Part2]
−
[chapter4]
フォルダに含まれている「panda」を参照してください。このプログラムでも、活性化状態でアニ
メーションしているパンダを数字キーで動かすことができます。
図 4-5
70
panda の実行画面
決死の PK 合戦 IR 版
ゲーム
pkir.jar
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
対応機種:P504i/F504i/N504i/So504i/D504i
c T.Kamachi
PK 合戦 IR 版は、504i シリーズの IR 通信機能を使って、
サッカーの PK 合戦を対戦形式で戦うゲームです。韓日共催
のサッカーワールドカップは大いに盛り上がりました。あの
興奮をなんとか i アプリでも再現したいという某編集長の熱
い思いから、この i アプリは制作されました。各国の激しい
戦いを思い出しながら真剣勝負を楽しんでください。
■ 遊び方
攻撃側はキッカーのキック方向を選び、守備側はゴール
キーパーのキャッチ方向を選びます。方向を決めたら、通信
を実行してキックの成功・失敗を判定します。攻撃と守備を
入れ替えながら交互に繰り返して、互いに 5 人のキッカーで
戦います。もし、5 人でも勝敗がつかない場合は、どちらか
が成功して相手が失敗するまでキックを続けます。
アプリを起動すると、まず先攻と後攻を選択します。相手
と話し合って決めてください。先攻の人はキック方向を、後
攻の人はキャッチ方向を、 ← → の矢印キーを使って選び
ます。方向を決めたら、 ソフトキー 1 を押して通信を開始しま
す。この際、赤外線の発光位置をよく確かめて、互いに向き
合うように電話機を向かい合わせてください。
機種によって多少異なりますが、ここで通信開始の許可を
求められます。許可すると通信が始まります。通信が終わ
ると、キックとキャッチの結果が表示されます。もしも通
信に失敗した場合は、その旨表示されますので、もう一度
ソフトキー 1
を押すところからやり直してください。
次は、攻守を入れ替えて、キックとキャッチを行います。
以降の手順は、この操作を交互に繰り返すことになります。
勝負がついた時点でゲームは終了となります。
終了するには、 ソフトキー 2 を押してください。
■ プログラムの解説
プログラムは、メインプログラムのほかに、matchgame
と pkbattle という 2 つのパッケージからなります。
matchgame パッケージは、IR 対戦およびメール対戦を行
うゲームのための汎用的な通信処理を提供します。
159
Part 3 プログラム事例編
match.java では、通信対戦のための基本的なインターフェイスを規定しています。IR 対戦でもメール
対戦でも、なるべく同じ手順で通信を行うことができるように共通のインターフェイスを定めています。
IrMatch.java では、IR 通信を用いて対戦を実現しています。504i で採用されている OBEX 通信方式では、
サーバー/クライアント型の通信を行います。send() メソッドではクライアント側、recv() メソッドでは
サーバー側として通信を行います。IrComm.java では、拡張 API を呼び出して実際に OBEX 方式の通信
を行います。
pkbattle パッケージでは、PkView.java で PK 合戦のユーザーインターフェイスを、PkLogic.java で PK
合戦の論理モデルを記述しています。PkView クラスでは、ゲームの状態に応じて画面の表示と、キー入
力の処理を行います。ゴールマウスやボール、ゴールキーパーの画像は、リソースから GIF ファイルを
読み込んでいます。ボールとゴールキーパーの GIF ファイルには、透過色が指定してあり、ゴールマウ
スの画像の上にオーバーレイして表示します。位置を変えて重ね合わせ表示を行うことで、少ないデータ
量で多様な画像を生成することができます。今回はキッカーやキーパーのユニホームは1種類しか作って
いませんが、それぞれユニフォームも選択できるようにすると、より臨場感がアップするはずです。
PkLogic クラスでは、PK 合戦の論理的な処理を行います。キックの成功/失敗の判定、途中経過の保
持、勝敗の判定などを行います。このクラスで特徴的なのは、ゲームを開始する際の初期化メソッドであ
る start() と、次のステップに進むためのメソッド next() を abstract メソッドにしてあることです。IR 通
信の場合とメール通信の場合とでは、ゲーム進行の手順が異なるので、その部分をサブクラスで記述する
ようにしてあるのです。
メインプログラムである pkir.java では、PkLogic クラスのサブクラスとしてアプリケーションを記述
し、IR 通信の場合のゲームの進め方を start() メソッドと next() メソッドに記述します。start() メソッドで
は、表示用のクラス、対戦用のクラスを生成し、先攻・後攻を選択します。next() メソッドは、 ソフトキー 1
を押すたびに呼び出されます。キック、キャッチの選択後であれば相手と通信を行い、次の結果表示ス
テップへと進めます。結果表示の後ならば、キック、キャッチへと進みます。
■ ディレクトリ構成
各プログラムのソースファイルは、以下のように付属 CD-ROM に収録されています。
…メインプログラム
part3 --- pkir --- src --- pkir.java
|
+- matchgame --- IrComm.java
|
|
|
+- IrMatch.java
|
|
|
+- Match.java
|
+- pkbattle ---- PkLogic.java
|
+- PkView.java
160
…OBEX による実際の通信を記述
…IR 通信による対戦を記述
…通信対戦の基本的なインターフェイスを規定
…PK 合戦の論理モデルを記述
…PK 合戦のユーザーインターフェイスを記述
スケジューラ
待ち受け/IR 対応版
Scheduler.jar
実用
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
対応機種:P504i/F504i/N504i/So504i/D504i
c M.ishii
待ち受けアプリとして使えるスケジューラです。また、赤
外線によるデータ交換もできます。最近の携帯電話機にはス
ケジューラが付いていることも多いのですが、休日が赤字で
表示されなかったり、機種変更すると操作方法が変わってし
まったりして、不便な場合があります。Java を用いて i アプ
リとしてスケジューラを作成し、こういった問題を解決して
います。
■ スケジューラの概要
携帯電話機に最初から付属するカレンダー機能やスケジュー
ラは、実際に活用しようとすると、次のような問題があり、
使いにくさを感じている人も多いのではないでしょうか?
●
起動するのに複数回のキー操作が必要で面倒
●
カレンダーを待ち受け画面にしていても、スケジュー
ルの書き込みや編集を行うにはスケジューラの起動が
別操作で必要になり面倒
●
土曜や休日が青字・赤字で表示されなかったり、表示
されても祝日に対応していなかったり、春分や秋分の
日が間違っていたりする
●
機種変更するたびに操作方法が変わり面倒
●
少女趣味すぎて自分に合わない(いい歳をした男がク
マさんのスケジューラなどを使っていると、かなり不
気味です)
●
赤外線通信機能は単にスケジュールを送受信するだけ
なので、複数人でスケジュールを一括管理するといっ
た目的には向かない
●
Palm 機などと赤外線通信でデータ交換しようとして
も、1件ずつの送受信しかできないので手間がかかる
●
アラームを設定しても予定時刻に電話機の電源が入っ
ていないと何も生じず、その後電源を入れても何のア
ラームも出ないので、予定があったことに気づかない
ことがある
161
Part 3 プログラム事例編
503i の i アプリでは、アプリのサイズが 10KB 以内という制限や、待ち受け的な使い方が事実上できな
いためアラーム機能を持たせにくいといった制約から、組み込みのスケジューラに匹敵するものを作成す
るのは困難でした。504i ではアプリのサイズが 30KB に拡張され、待ち受けアプリとして i アプリを常時
起動させておくことが可能になり、赤外線通信機能も搭載されたことから、組み込みアプリに劣らないス
ケジューラを作成することが可能になりました。Palm などでは普通に見られる、置き換えアプリが携帯
電話上でもようやく可能になったというわけです。
本スケジューラは、以下の特長を持ち、組み込みのスケジューラに見られる問題を解決しています。
●
待ち受けアプリとしても、通常のアプリとしても使用可能
●
待ち受け起動している場合、通常はカレンダー表示であり、アプリを活性化状態にするボタンを押す
だけでスケジュールの書き込み・変更ができるようになる
●
春分・秋分も含めてすべての祝祭日に対応
●
赤外線通信を用いて、本スケジューラ間だけでなく、携帯電話に組み込みのスケジューラや Palm の
予定表とのデータ交換が可能
●
複数件のスケジュールをまとめて送受信できる
●
1 回の赤外線通信で、データをまとめて交換できるのでスケジュールの一括管理に便利
●
電源を切っていたりスケジューラを起動させていなくても、次回の起動や電源投入時に、アラームが
出る
作成にあたっては、NTT ドコモ独自の UI コンポーネントをなるべく使わないようにし、カレンダーや
リストなどを自作したので、J-Phone や au などで採用されている MIDP ベースのアプリに移植すること
が容易にできるようになっています。カレンダーなどの自作コンポーネントは、スケジューラ以外にもさ
まざまな目的に使えるので、こういった部品だけを取り出して再利用可能になるように配慮してありま
す。また、本スケジューラを他のアプリに組み込んでスケジュール管理機能を持たせるなど、単体のスケ
ジューラとしての使用に留まらず、いろいろな目的に活用することもできます。
■ 基本的な使い方
起動すると、カレンダーが現れます。待ち受け起動して、非活性化状態にあるときにはキー入力を受け
付けないので、スケジュールの入力や編集はできませんが、予定の入っている日は下線が付いて表示され
るので、どの日にスケジュールが入っているかはすぐに分かります。
各電話機の操作により活性化状態にすると、スケジュールの入力ができます。日付の選択とスケジュー
ルの表示は、次の表のキー操作で行います。選択されている日は緑地で表示され、今日の日付は黄色地で
表示されます。
■
日付の選択とスケジュールの表示
キー操作
←
機能
→
セレクト キー
↑
↓
キー
日付の選択
選択された日付のスケジュールの表示。スケジュール表示画面で、
キーで前日へ、 → キーで翌日のスケジュール表示画面へ移動
←
スケジュールの入力や編集、削除は、スケジュール表示画面のサブメニューで行います。スケジュール
表示画面で、 ソフトキー 2 (メニュー)を押すと次の図の左のようなサブメニューが表示されます。サブメ
ニューから[新規]を選択すると、次の図の右のような予定の入力画面が開きます。
162
スケジューラ 待ち受け/IR 対応版 実用
サブメニュー画面
予定の入力画面
一番上の入力欄には予定の内容を書き込みます。次に、下の予定時刻を選び セレクト キーを押すと、日
時変更の画面に切り替わります。 ↑ ↓ ← → のキーを押して、変更したい年・月・日・時刻を数字キーで
入力します。予定時刻の設定が終われば、 ソフトキー 1 (OK)でスケジュール入力画面に戻ります。
予定日時の下にあるアラーム機能のチェックボックスにチェックを入れておくと、予定時刻になったと
きに、メッセージや音で知らせてくれます。なお、
「音を鳴らす」にチェックを入れると、音に加えバイブ
レーションも作動します。アラーム機能によりメッセージが表示されたときには、スケジューラを活性化
状態にして、
[OK]ボタンを押すことでメッセージを消すことができます。ボタン操作が 2 回になり多少
面倒で、4 章で解説した「非活性化状態でキー入力を促すことを極力避ける」に反してしまっているのです
が、これは致し方ないところでしょう。
赤外線による共有の項目で「共有する」にチェックを入れておくと、他の携帯電話機や Palm 機などと
のデータ交換が可能になります。
既存のスケジュールの内容を変更するには、一覧表示画面で変更したいスケジュールを選択し セレクト
を押すか、 ソフトキー 2 (メニュー)を押して「編集」を選びます。その後の操作は新規にスケジュールを入
れるときと同じです。同様に、スケジュールを削除するには、 ソフトキー 2 (メニュー)を押して「削除」を
選びます。確認のダイアログボックスで、
[はい]を選ぶと削除されます。なお、スケジュールの削除は、
個々の予定の編集を行う画面で ソフトキー 2 を押して「削除」を選ぶことによっても行えます。
作業が終了したら、カレンダーの表示画面に戻り、 ソフトキー 1 (終了)を押すと、待ち受け起動してい
る場合には非活性化状態になり、通常起動の場合にはアプリを終了します。
■ スケジュールの受信
他の電話機の組み込みスケジューラや Palm 機からデータを受信するには、カレンダーの表示画面で
ソフトキー 2 (通信)を押して表示されるメニューから「受信」を選びます。受信するかどうかの確認を求め
る画面が表示され、
「はい」を押すと受信状態になります。他の電話機の組み込みスケジューラや Palm 機
側で送信の操作を行い、赤外線ポートを向かいあわせてしばらく待つと受信が完了します。ただし、送ら
れたデータが vCalendar 形式に従っていない場合には何のデータも受信されません。
■ スケジューラ間でのスケジュールの送受信
2 台の携帯電話で本スケジューラを使っている場合は、指定した日付の範囲のスケジュールを一度の操
作で交換することができ、たいへん便利です。
163
Part 3 プログラム事例編
データ交換をするには、一方の電話機で上記の受信操作をし、他方の電話機では、カレンダー表示画面
で ソフトキー 2 (通信)を押して表示されるメニューから「送信」を選びます。すると、以下の図のようなス
ケジュールを交換する日付の範囲を選択する画面が出るので、数字キーで指定を行います。
必ず今日のスケジュールを含むようになっているため、デフォルトで表示される「昨日以前の 00 日目
から明日以降の 00 日目までの予定を送信します」の場合には、今日のスケジュールだけが送信され、
「昨
日以前の 01 日目から明日以降の 01 日目までの予定を送信します」の場合には昨日から明日までの 3 日間
の予定をまとめて送信します。
送信されるのは、各スケジュールの入力の際に、
「赤外線による共有」の項目で「共有する」にチェック
を入れたものだけです。設定が終わったら、 ソフトキー 1 (送信)を押すと、送信するかどうかの確認を求
める画面が表示され、
「はい」を選ぶとデータ交換が行われます。
なお、
「送信」
「受信」という名称にはなっていますが、実際には受信側から送信側へもデータが送られ、
1 回の操作で送受信が完了します。ただし、この機能は、本スケジューラを両電話機間で用いている場合
のみ使用可能ですので注意してください。Palm 機とのデータ交換の場合、送信機能は送信しか行いませ
ん。携帯電話機に組み込まれているスケジューラの場合には、指定した日付の間に 2 件以上のスケジュー
ルがあるとデータ交換はできませんので、その場合は次の 1 件送信機能を使って 1 件ずつ行う必要があり
ます。
■ スケジュールの送信
特定のスケジュールだけを送信したい場合や、携帯電話に組み込みのスケジューラにデータを送信した
い場合には、スケジュールの一覧画面、あるいはスケジュールの編集画面で、 ソフトキー 2 (メニュー)を
押し、
「1 件送信」を選びます。送信するかどうかの確認を求める画面が表示されますので、
「はい」を押す
と送信されます。この機能を用いて本スケジューラ間でデータをやり取りすることもできますが、その場
合はデータ交換ではなく送信だけの機能になります。
■ プログラムの解説
プログラムのソースファイルは、付属 CD-ROM に収録されていますので、そちらを参照してください。
いろいろな機能を盛り込んでいるうちにプログラムが長くなってしまい、まったく画像を用いていないに
もかかわらず、jar ファイルのサイズが 24KB もあります。このため、コードの中で重要と思われる箇所
だけを解説します。
起動すると、待ち受け起動か通常起動かを判別します。待ち受け起動であれば setClockTick メソッド
を使い、毎分 00 秒にアラームを鳴らすかどうかのチェックを行います。通常起動であればタイマーを開
164
スケジューラ 待ち受け/IR 対応版 実用
始させて、10 秒ごとにアラームを鳴らすかどうかのチェックを行っています。1 分ごとでなく 10 秒ごと
であるのは、1 分ごとの場合、00 秒から 59 秒までのどこかでアラームが出ることになるからで、なるべ
く毎分 00 秒に近い時刻でアラームが出るように 10 秒おきにアラームのチェックをしているわけです。
また、起動時に判別した起動状態を isConsierge という boolean 型の変数に入れておき、 ソフトキー 1 (終
了)が押されたときには、isConsierge の値が true であれば待ち受けアプリを非活性化状態にし、false で
あれば terminate() メソッドを呼び出してアプリを終了するようにしています。
各スケジュールは sched クラスにまとめ、それを Vector に入れて保持しています。
赤外線受信は IRAccept メソッド内で処理し、赤外線による送信機能は送信する日を選択するクラスの
ソフトキーの処理で行い、1 件送信はメニューの処理部分で行っています。
本スケジューラでは、携帯電話機に組み込まれたスケジューラや Palm 機と赤外線を用いたデータ交換が
できるように、データを vCalendar 形式に基づいて送受信しています。getDataToSend メソッドで、送信す
るデータを vCalendar 形式で作成し、受信した vCalendar 形式のデータを parseSentData メソッド内で処
理しています。vCalendar 形式ではデータに日本語が含まれる場合には Quoted-Printable で処理する規則
になっているため、getQuotedPrintable メソッドで SJIS の日本語文字列から Quoted-Printable を生成し、
parseQuotedPrintable で Quoted-Printable を SJIS の日本語文字列に変換しています。Quoted-Printable
関係の処理をするときには参考になると思います。
カレンダーやスケジュール一覧画面は、それぞれ独自のクラスを用いて実現しています。メニューはス
ケジュール一覧で用いたクラスを使い回しています。メニューは複数の画面に存在するので、その処理を
分離できるように独自のインターフェイスを定義しています。Java でインターフェイスを学習する際の
サンプルになるでしょう。
なお、カレンダーの表示位置としてどの位置が最適かは、機種ごとのフォントの大きさや、待ち受け
起動したときの非活性化状態で表示される時計の表示位置によって微妙に異なります。本アプリの場合、
SO504i の場合だけがカレンダーの上に時計が重なって見にくいので、SO504i だけはカレンダーの表示位
置を変更したソースコードを用意し、jar ファイルも別に作成して、付属 CD-ROM の SO504i フォルダ内
に収録してあります。
165
赤外線名刺
実用
NameCard.jar
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
対応機種:P504i/F504i/N504i/So504i/D504i
c M.ishii
名刺を整理する i アプリです。名前/所属/地位/電話番
号/メールアドレスを入力して保存することができます。こ
のアプリを用いて名刺を整理しておけば、いつでも電話番号
などを調べることができます。
さらに便利な機能として、504i の新機能を用いて名刺デー
タに記載されている電話番号に、i アプリから直接電話をか
けることが可能です。また、i アプリ間で赤外線通信による
名刺交換や、携帯電話に内蔵されている電話帳、Palm 機の
アドレス帳とのデータ交換も簡単に行うことができます。
■ 使い方
起動すると、左の図にあるように名前の一覧表示画面が現
れます。この画面では、過去に入力した名刺データの名前
データ部が一覧表示されています。最近入力、または編集さ
れたものほど上に並ぶようになっています。
新たにデータを入力するには、 ソフトキー 2 (メニュー)を
押し、
「新規」を選択します。すると、名刺データを入力す
る画面が出るので、必要な項目を入力していきます。入力し
終わったら、 ソフトキー 1 (OK)を押します。名前は必ず必要
で、これを入力せずに保存することはできません。
既存の名刺データの内容を変更するには、 ↑ ↓ キーで
名前の一覧から編集したい項目を選び、 セレクト キーを押す
か、 ソフトキー 2 (メニュー)を押して「編集」を選びます。す
ると編集画面が出るので、必要なデータを書き換えます。途
中まで編集した内容を保存せずに破棄するには(つまり変更
をキャンセルするには)
、編集画面で ソフトキー 2 (メニュー)
を押して「取消」を選びます。名刺データの消去は、変更の
場合と同様に各メニューから「削除」を選びます。
名刺の相手に電話をかけるには、名前の一覧表示画面か、
データの入力/編集画面で、 ソフトキー 2 (メニュー)を押し
て「電話をかける」を選びます。
メニュー画面と名刺データの入力画面を、以下の図に示し
ておきましょう。
169
Part 3 プログラム事例編
メニュー画面
データの入力画面
■ 赤外線通信機能による名刺の交換
赤外線機能を用いて名刺データの送受信を行うことができます。名刺を交換するには、受信側の電話機
で、名前の一覧表示画面から ソフトキー 2 (メニュー)で「赤外線受信」を選びます。送信側の電話機で、送
信したい名刺を選び、 ソフトキー 2 (メニュー)で「赤外線送信」を選ぶか、 セレクト キーで編集画面に移っ
てから、 ソフトキー 2 (メニュー)で「赤外線送信」を選びます。送信あるいは受信の確認をする画面が出る
ので、
「はい」を押します。2 つの電話機の赤外線ポートを近づけて、しばらく待つとデータ送受信が完了
します。送信側のデータは、これにより消えることはありません。
i アプリ同士でなくても、Palm 機のアドレス帳や電話機内蔵の電話帳とのデータ交換を行うことも可能
です。ただし、通常の電話機内蔵の電話帳では所属や地位の項目がないため、これらのアプリにデータを
送信しても、所属と地位のデータは失われます。逆に各携帯電話の電話帳に固有の詳細情報(名前/所属
/地位/電話番号/メールアドレス以外の情報)は、赤外線名刺でデータを受信しても失われます。
■ プログラムの解説
プログラムのソースファイルは、付属 CD-ROM に収録されていますので、そちらを参照してください。
起動すると、スクラッチパッドから名刺データを読み込み、一覧表示します。データは Vector にいれ
て保持します。新たにデータを入力したり、既存のデータを編集、削除したときには Vector の内容を更
新すると同時に、スクラッチパッドの内容も更新します。
赤外線機能による受信は IRAccept メソッドが処理し、送信は IRSend メソッドが処理します。送受信
の際には、データは vCard 形式で扱われます(詳しくは 5 章を参照)。データの本体は、以下のように表
されます。
N;CHARSET=SHIFT_JIS:佐藤 英一 ;;;;
ORG;CHARSET=SHIFT_JIS:アスキー
TITLE;CHARSET=SHIFT_JIS:編集長
TEL;VOICE:09011119999
EMAIL;INTERNET:[email protected]
…「N;」以降の 1 行は、名前
…「ORG;」以降の 1 行は、会社などの所属
…「TITLE;」以降の 1 行は、役職などの地位
…「TEL;」以降の 1 行は、電話番号
…「EMAIL;」以降の 1 行は、メールアドレス
このように、RFC に定められている規格に従ってデータを扱っているので、本アプリ間でなくてもデー
タの交換を行えます。ただし、通信先のソフトの処理によっては、データの一部が失われる可能性があり
ます。名前等が日本語である場合には、vCard では SJIS のデータをそのまま書くので、スケジューラの
ように、Quoted-Printable を処理する必要はありません。
170
日記帳
実用
Diary.jar
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
対応機種:P504i/F504i/N504i/So504i/D504i
c M.ishii
日記帳アプリです。普通の日記帳やメモとしても有効に
利用できますが、付加機能として、赤外線機能を用いた交換
日記機能があります。ノートの交換日記では日記帳自体を
交換してしまうので、複数の人のあいだで交換を行ったり、
特定の日の日記だけを交換したりすることはできませんが、
本アプリでは指定した日付だけの日記を交換するので、多く
の人と必要なデータだけをやりとりするような使い方もでき
ます。
■ 使い方
起動すると、カレンダーが現れます。本アプリは待ち受け
アプリとしても起動可能ですが、その場合には非活性化状態
ではカレンダーが表示され続けます。待ち受け起動して、非
活性化状態にあるときにはキー入力を受け付けないので、日
記の入力や編集はできませんが、日記を書いた日は下線が付
いて表示されます。
通常起動した場合、あるいは、待ち受け起動した場合でも
各電話機の操作により活性化状態にすると、日記の入力が可
能になります。カレンダー上で、 ↑ ↓ ← → キーで日記
を書き込む日付を選びます。選択されている日は緑地で表示
され、今日の日付は黄色地で表示されます。日記を書き込む
日付を選んだ後、 セレクト キーを押すと日記を入力する画面
に切り替わります。
指定した日にすでに日記が書き込まれている場合には、そ
の日記を編集する画面になります。日記を入力/編集した
後、 ソフトキー 1 (OK)を押すと日記が保存されます。書き
換えた日記を保存せずに破棄するときには、 ソフトキー 2 (メ
ニュー)を押し、
「取消」を選びます。既存の日記を消去する
には、同様にメニューから「削除」を選ぶか、日記編集画面
で日記の内容を消去して ソフトキー 1 (OK)を押します。
作業が終了したら、カレンダーの表示されている画面に戻
り、 ソフトキー 1 (終了)を押すと、待ち受け起動している場
合には非活性化状態になり、通常起動の場合にはアプリを終
了します。
173
Part 3 プログラム事例編
■ 赤外線通信機能による名刺の交換
赤外線通信機能を用いて日記を交換するには、まず、一方の電話機でカレンダーが表示されている状
態にし、 ソフトキー 2 (受信)を押します。本当に受信してよいかどうかを確認する画面が表示されるので、
「はい」を選択します。そして、もう一方の電話機の側で、交換したい日付の日記を表示させ、 ソフトキー 2
(メニュー)を押して「送信」を選択します。ここでも、確認の画面が表示されるので「はい」を選択し、受
信側の電話機と赤外線ポートを向き合わせます。しばらくすると、データ交換が完了します。
この手順は名称上「送信」
「受信」ということになっていますが、実際にはデータが交換され、受信側か
ら送信側へも日記データが送られます。どの日付のデータを交換するかを決めるのが送信側であるという
だけのことです。また交換日記ですので、交換後はもとの日記は相手側に渡り、自分の側の携帯電話上に
はデータは残りませんので注意してください。
なお、携帯電話ネイティブの組み込みアプリには、この日記帳アプリに相当するものは存在しないの
で、この交換日記帳同士のデータ交換以外は想定されていません。
■ プログラムの解説
プログラムのソースファイルは、付属 CD-ROM に収録されていますので、そちらを参照してください。
起動すると、待ち受け起動か通常起動かを判別し、結果を isConsierge という boolean 型の変数に入れ
ておきます。 ソフトキー 1 (終了)が押されたときに、isConsierge の値が true であれば待ち受けアプリを非
活性化状態にし、false であれば terminate() メソッドを呼び出してアプリを終了するようにしています。
赤外線通信の受信部分は IRAccept メソッドで処理し、送信部分は IRSend で処理しています。送信側
は、まず交換する日記の日付を受信側に送ってデータを受信し、それから自分の側が持っている日記を送
信する仕組みになっています。受信側では、GET 要求の場合には、要求されている日付を見て必要なデー
タを送り、PUT 要求の場合には送られてきたデータを日記帳に保存しています。
カレンダーやメニューを処理するクラスは、スケジューラで用いているものとまったく同じです。このた
めスケジューラと同様に、SO504i の場合だけがカレンダーの上に時計が重なって見にくいので、SO504i だ
けはカレンダーの表示位置を変更したソースコードを用意し、jar ファイルも別に作成して、付属 CD-ROM
の SO504i フォルダ内に収録してあります。
174
ポーカー対戦
メール版
pokermail.jar
ゲーム
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
・
対応機種:P504i/F504i/N504i/So504i/D504i
c T.Kamachi
本書の「ポーカー対戦 IR 版」をメールによる対戦形式に
したものです。このプログラムも、本書の姉妹編『i モード
Java プログラミング スタンドアロン・アプリケーション編』
に掲載した「ポーカー」を改造したものです。携帯電話を持
つ相手と 1 対 1 で勝負します。カード交換は 1 回だけ行え
ます。勝負するときには、レートを変更してから行います。
勝負に勝てば、レートの倍額がスコアに加算されます。
■ 遊び方
通常の方法で起動すると、子としてゲームを始めることに
なります。ゲームを開始する前に、自分と相手のメールアド
レスを入力します。i アプリを起動できる携帯電話のアドレ
スを指定してください。
その後の操作方法は「ポーカー対戦 IR 版」と同じです。 1
キーを押して通信を行うと、選んだカードの情報が相手側に
メールで送信されます。相手側では、あらかじめ同じ i アプ
リをダウンロードしておかなければなりません。相手側と
して指定された携帯電話では、ポーカー対戦のお誘いメール
が届きます。このメールの本文中にはポーカー対戦 i アプリ
へのリンクが表示されます。この状態で セレクト キーを押す
と、ポーカー対戦 i アプリを起動することができます。相手
は必ず親としてゲームを行います。操作方法は子の場合と同
じです。 1 キーを押すと通信を開始します。通信が完了す
ると、カードが交換され、相手のカードも表示されて、役が
判定されます。
子の側では、同様にメールが届き、i アプリを起動するこ
とができます。起動すると、両者のカードが表示され、役
が判定されます。 ソフトキー 1 を押すと、次のゲームへ進みま
す。こうして点数がなくなるまでゲームを続けることができ
ます。
子に限っては、 ソフトキー 1 でゲームを下りて、カードを配
りなおすことができます。 ソフトキー 2 を押すとゲームを終了
します。
175
Part 3 プログラム事例編
■ プログラムの解説
card パッケージ、poker パッケージは、
「ポーカー対戦 IR 版」とまったく同じものです。matchgame
パッケージは、「PK 合戦 メール版」とまったく同じものです。
わずかな差分で、同じゲームを IR 対戦にもメール対戦にもできることがわかると思います。
■ プログラム使用上の注意
このプログラムを実際にみなさんが利用する場合には、
「決死の PK 合戦メール版」と同様の変更が必要
になります。ADF ファイル pokerMail.jam と、CGI プログラム iMail.cgi を変更してください。変更の内
容は、「決死の PK 合戦メール版」と同じですので、そちらの解説を参照してください。
■ ディレクトリ構成
各プログラムのソースファイルは、以下のように付属 CD-ROM に収録されています。
part3 --- PokerMail --- src --- PokerMain.java …メインプログラム
|
+- PokerPlayMail.java …ゲームの進行を管理
|
…メールによる対戦を記述
+- matchgame --- MailMatch.java
|
…通信対戦の基本的なインターフェイスを規定
|
+- Match.java
|
…ポーカーの手札を記述
+- Poker ------- HandCard.java
|
|
…手札の役を記述
|
+- HandPoint.java
|
|
…ポーカーゲームのロジックを記述
|
+- PokerPlay.java
|
…トランプのカードを規定
+- card -------- Card.java
|
|
…トランプの場札を規定
|
+- FieldCard.java
|
|
…トランプの山を用意
|
+- PoolCard.java
|
…メール送信用 CGI プログラム
+- iMail.cgi
176
クラス AnchorButton
com.nttdocomo.ui
AnchorButton
クラス
DoJa2.0
このクラスは、Panel に配置する HTML のアンカー風のボタンを定義します。このコンポーネ
ントにはテキストやその見出しとなるイメージを設定することができます。
このコンポーネントがユーザー操作可能の場合は、テキストなら下線付き、画像なら周囲に枠
線の付いた形で表示されます。setEnabled() を用いてユーザー操作不可にした場合、テキストな
ら下線なし、画像なら周囲の枠線を取り除いた形で表示されます。
画像はコンポーネントの表示領域の左上から表示されます。同時にテキストも設定されている
場合は、画像の下端にテキストの下端を合わせた高さで画像の右側に表示されます。さらに、同
じ状況でテキストが折り返される場合、折り返されたテキストの表示位置は画像の左端からにな
ります。
折り返されたテキストの表示位置
AnchorButton の縦方向のサイズは、画面の縦方向のサイズには制限されません。しかし、横方
向のサイズは画面の横方向のサイズに制限されます。コンポーネントの幅より長いテキストが設定
された場合、テキストが自動的に折り返されて複数行に渡って表示されます。そのため、ユーザー
操作不可の AnchorButton オブジェクトは、複数行に渡る文字列を表示するのに使用されます。
setLayoutManager() の引数に null を指定して呼び出した場合は、位置設定後にコンポーネント
が画面の横にはみ出した部分は、画面端で折り返されることはなく表示されません。コンポーネ
ントのサイズが変更された場合は、変更後のコンポーネントの幅でテキストを折り返して表示し
直します。
Component から継承するメソッド:
getHeight(), getWidth(), getX(), getY(), setBackground(), setForeground(),
setLocation(), setSize(), setVisible()
Interactable の実装:
requestFocus()、setEnabled()
182
クラス AnchorButton
例外:
Image オブジェクトを引数に取るコンストラクタやメソッドで、引数で指定された Image オブ
ジェクトがすでに dispose() を呼ばれ破棄されていた場合、UIException(ILLEGAL_STATE) が
発生
関連項目:
親クラス:
☞
Component
実装しているインターフェイス:
イベントの処理:
☞
Interactable
☞
ComponentListener.componentAction(Component c, int type,
☞
Panel.add(Component c)
int param)
Panel への配置:
public final class AnchorButton
extends Component
implements Interactable {
//コンストラクタ
public
public
public
public
AnchorButton();
AnchorButton(Image image);
AnchorButton(Image image, java.lang.String text);
AnchorButton(java.lang.String text);
//インスタンスメソッド
public
public
public
public
void
void
void
void
//Overrides Interactable.requestFocus
requestFocus();
//Overrides Interactable.setEnabled
setEnabled(boolean b);
setText(java.lang.String text); //Overrides Interactable.setText
setImage(Image image);
}
コンストラクタの概要
■
public AnchorButton()
何も表示するものがないアンカーボタンを生成する。 テキスト文字列とラベル画像の両方に null
が指定されたものとみなす。
■
public AnchorButton(java.lang.String text)
テキスト文字列を指定してアンカーボタンを生成する。 ラベル画像には null が指定されたものと
みなす。
引数:text
■
表示するテキスト文字列
public AnchorButton(Image image)
ラベル画像を指定してアンカーボタンを生成する。 テキスト文字列には null が指定されたものと
みなす。
引数:image
表示するラベル画像
183
com.nttdocomo.ui
●
クラス AudioPresenter
■
public AnchorButton(Image image, java.lang.String text)
ラベル画像とテキスト文字列を指定してアンカーボタンを生成する。
引数:image
表示するラベル画像
text
表示するテキスト文字列
メソッドの概要
■
public void requestFocus()
Panel に追加された AnchorButton にフォーカスをセットするように要求する。Panel に追加され
ていない場合、要求は無視される。
■
public void setEnabled(boolean b)
AnchorButton へのユーザー操作の可否を設定する。デフォルトはユーザー操作可能(true)
。
引数:b
■
ユーザー操作を受け付ける(true)か、受け付けない(false)か
public void setText(java.lang.String text)
AnchorButton オブジェクトに表示するテキスト文字列を設定する。
引数:text
■
表示するテキスト文字列
public void setImage(Image image)
AnchorButton オブジェクトに表示するラベル画像を設定する。
引数:image
表示するラベル画像
com.nttdocomo.ui
AudioPresenter
クラス
このクラスでは、i メロディ形式などの音声メディアデータ(MediaData、MediaSound)を再生す
るための機能が提供されています。ディスプレイのカレントに設定されている Frame が、Canvas
もしくは Panel のどちらであってもこのクラスを利用することができます。
setMediaListener() で MediaListener を登録すると、再生状態をリスナーオブジェクトに通知
します。setMediaListener() を複数回呼び出した場合は、最後に登録したリスナーオブジェクト
だけが有効となります。引数に null を指定すると、リスナーの登録を削除します。
AudioPresenter インスタンスの取得には、コンストラクタを用いるのではなく、クラスメソッ
ドの getAudioPresenter() を用います。
AudioPresenter に再生させる音声メディアデータは setData() か setSound() を用いて設定しま
す。ただし、setData() と setSound() は1つのインスタンスに対して併用できません。同じメソッ
ドを複数回呼び出した場合は、最後に設定したデータが有効になります。
stop() で停止した場合、play() で再開してもデータの先頭からの再生となる点に注意してくだ
さい。
メディアデータに同期イベントが埋め込まれている場合、メディア再生時に同期イベントのタ
184
クラス AudioPresenter
イミングに合わせて MediaListener に通知します。同期イベントを発生させるかどうかを play()
DoJa2.0 では新たに優先順位の属性が追加され、サウンドに再生優先順位を持たせることがで
きます。優先順位は setAttribute() により設定します。優先順位は、端末が持つ音源チップの能
力を超えてサウンドを再生しようとした時に、再生するサウンドを決定する要因になります。複
数のサウンドが同じ優先順位を持つ場合、どのサウンドが優先されるかは機種に依存します。
MediaPresenter の実装:
getMediaResource(), play(), setAttribute(), setData(), setMediaListener(), stop()
例外:
●
setData()、setSound() は、端末で再生できない音声メディアデータを設定した場合には UIExcep
tion(UNSUPPORTED_FORMAT)、データ再生中に呼び出した場合には UIException(ILLEGAL_
STATE) が発生
●
ミニマムスペックでは setData() を呼ぶと UnsupportedOperationException が発生
●
play()、play(int)、stop()、pause() を呼び出したとき、メディアデータがセットされていなかった
り、メディアデータが再生可能でない場合、UIException(ILLEGAL_STATE) が発生
●
play()、play(int)、restart() で再生しようとしたとき、オーディオ再生のためのリソースが確保で
きない場合、UIException(NO_RESOURCES または BUSY_RESOURCE) が発生
●
setSound()、setData の引数に null が指定された場合、NullPointerException が発生
●
setData() を端末がサポートしていない場合、UnsupportedOperationException が発生
●
setAttribute() の第一引数で指定された有効な属性に対し、第二引数に不正な値を指定した場合、
IllegalArgumentException が発生
ミニマムスペック:
●
setData() を呼び出すと例外 UnsupportedOperationException が発生
●
setAttribute() は何もしない
●
再生方法に関する属性値は定義されていない
●
AUDIO_PLAYING、AUDIO_STOPPED、AUDIO_COMPLETE イベントのみ発生が保証される
機種依存:
●
再生優先順位(PRIORITY)、再生同期(SYNC_MODE)がサポートされているかどうか
●
AUDIO_PLAYING、AUDIO_STOPPED、AUDIO_COMPLETE イベント以外のイベントが発
●
pause()、restart()、setData() がサポートされているかどうか
●
同じ優先度を持つ複数のサウンドデータの再生順序
●
再生位置の指定が可能かどうか
生するかどうか
DoJa1.0 からの変更点:
●
1.0 では、ミニマムスペックでは AUDIO_COMPLETE イベントタイプのイベントのみ発生する
ことが保証される。2.0 では、そのほかに AUDIO_PLAYING、AUDIO_STOPPED の各イベン
トタイプのイベントが発生することが保証される
●
2.0 では、play()、play(int time) が呼ばれた時にオーディオ再生のためのリソース確保を行う
185
com.nttdocomo.ui
を呼び出す前に設定しておく必要があります。デフォルトでは同期イベントは発生しません。
クラス AudioPresenter
●
リソースが確保できない場合の例外は、1.0 では getAudioPresenter() で発生。2.0 では play() も
しくは play(int time) で発生
●
2.0 では、再生中にアプリケーションがサスペンドした場合、再生は停止する。すなわち、stop()
が呼ばれたのと同じ状態になる
●
play()、play(int)、stop()、pause() は例外 UIException(ILLEGAL_STATE) を発生
●
play()、play(int)、restart() は例外 UIException(NO_RESOURCES または BUSY_RESOURCE) を
●
setAttribute() は IllegalArgumentException を発生
●
2.0 では新たにデータに対し同期、一時停止、再開の処理が可能になった。また、属性として優
発生
先順位、同期再生が追加された
関連項目:
実装しているインターフェイス
リスナーの登録
☞
☞
MediaPresenter
setMediaListener(MediaListener listener)
設定するメディアリソース
☞
setData(MediaData data), setSound(MediaSound sound)
public class AudioPresenter
extends java.lang.Object
implements MediaPresenter {
// コンストラクタ
protected AudioPresenter();
// ベンダー定義の属性項目の境界
// ベンダー定義属性の最小値
protected static final int MIN_VENDOR_ATTR
=
64;
// ベンダー定義属性の最大値
protected static final int MAX_VENDOR_ATTR
= 127;
// MediaListener に通知するイベント
=
=
=
=
=
=
1;
2;
3;
4;
5;
6;
protected static final int MIN_VENDOR_AUDIO_EVENT =
64;
public
public
public
public
public
public
static
static
static
static
static
static
final
final
final
final
final
final
int
int
int
int
int
int
AUDIO_PLAYING
AUDIO_STOPPED
AUDIO_COMPLETE
AUDIO_SYNC DoJa2.0
AUDIO_PAUSED DoJa2.0
AUDIO_RESTARTED DoJa2.0
//再生開始
//再生中断
//再生完了
//同期イベント
//再生一時停止
//再生再開
// ベンダー定義のイベント種類の境界
// ベンダー定義のイベント種類の最小値
// ベンダー定義のイベント種類の最大値
protected static final int MAX_VENDOR_AUDIO_EVENT = 127;
// 属性種類の ID
public static final int PRIORITY
public static final int SYNC_MODE
186
DoJa2.0
DoJa2.0
=
=
1; //再生優先順位属性
2; //再生同期イベントの発生属性
クラス AudioPresenter
// 優先順位属性の値
DoJa2.0
DoJa2.0
DoJa2.0
=
=
=
1; //最も低い優先度
5; //普通の優先度
10; //最も高い優先度
// 再生イベント発生の属性値
public static final int ATTR_SYNC_OFF
public static final int ATTR_SYNC_ON
DoJa2.0
DoJa2.0
=
=
0; //同期イベントを発生させない
1; //同期イベントを発生させる
// オプションのオーディオ属性項目の境界
// オプションのオーディオ属性の最小値
public static final int MIN_OPTION_ATTR
DoJa2.0
= 128;
DoJa2.0
= 255;
// オプションのオーディオ属性の最大値
public static final int MAX_OPTION_ATTR
// クラスメソッド
public static AudioPresenter getAudioPresenter();
// インスタンスメソッド
public MediaResource getMediaResource();
// Overrides MediaPresenter.getMediaResource()
public
public
public
public
public
void
void
void
void
void
play(); // Overrides MediaPresenter.play()
play(int time); DoJa2.0
pause(); DoJa2.0
restart(); DoJa2.0
setAttribute(int attr, int value);
// Overrides MediaPresenter.setAttribute()
public void
public void
setData(MediaData data);
setMediaListener(MediaListener listener);
public
public
public
public
setSound(MediaSound sound);
stop(); // Overrides MediaPresenter.stop()
getCurrentTime(); DoJa2.0
setSyncEvent(int channel, int key)
// Overrides MediaPresenter.setMediaListener()
void
void
int
void
DoJa2.0
}
コンストラクタの概要
■
protected AudioPresenter()
アプリケーションはこのコンストラクタを用いて、直接このクラスのインスタンスを生成すること
はできない。
メソッドの概要
■
public MediaResource getMediaResource()
設定されている MediaResource を返す。リソースが設定されていない場合は null を返す。
187
com.nttdocomo.ui
public static final int MIN_PRIORITY
public static final int NORM_PRIORITY
public static final int MAX_PRIORITY
クラス AudioPresenter
■
public static AudioPresenter getAudioPresenter()
再生する MediaResource が設定されていない、メディアイベントを通知する MediaListener が未
登録である AudioPresenter を返す。
■
public void play()
設定されている MediaResource を先頭から再生する。リスナーが登録されている場合は、リス
ナーに AUDIO_PLAYING イベントを通知する。データを最後まで再生すると停止し、リスナーに
AUDIO_COMPLETE イベントを通知する。また、データ再生中に play() を再度呼び出すと、再生
中のデータを停止し、先頭から再生し直す。
■
public void setAttribute(int attr, int value)
再生方法に関する属性値を設定する。
■
引数:attr
属性項目を示す整数値
value
属性値
public void setData(MediaData data)
再生する MediaResource として、MediaData を設定する。
引数:data
■
再生するメディアデータ
public void setMediaListener(MediaListener listener)
メディアイベントを通知する MediaListener を登録する。
引数:listener
メディアイベントを受け取る MediaListener。null を指定するとリスナーの登録
を解除する
■
public void setSound(MediaSound sound)
再生する MediaResource として、MediaSound を設定する。
引数:sound
■
再生するメディアサウンド
public void stop()
再生を停止する。リスナーが登録されている場合は、リスナーに AUDIO_STOPPED イベントを
通知する。データ再生を停止しているときに stop() を再度呼び出すと、AUDIO_STOPPED イベン
トを通知するが、メディアデータ再生に関わる処理は何もしない。途中で再生を停止した場合で
も、play() で再生を再開した場合は、データの先頭からの再生となる。
■
public int getCurrentTime()
DoJa2.0
曲頭から現在の再生位置までの演奏時間を ms 単位で返す。
■
public void setSyncEvent(int channel, int key)
DoJa2.0
引数で指定されたチャンネルとキーに対応するノートメッセージを同期イベントとして設定する。
引数:channel 同期イベントに利用するチャンネル
key
同期イベントに利用するキー。端末がサポートする MFi の有効キー範囲は 21∼119
(MFi のデータとしては−24∼74)
、MIDI の有効キー範囲は 0∼127
■
public void play(int time)
DoJa2.0
メディアデータを引数で指定された位置から再生する。そのほかの内容は play() と同じ。端末やメ
188
クラス Button
ディアデータがこのメソッドをサポートしていない場合、引数は無視され、先頭から再生される。
■
public void pause()
DoJa2.0
メディアデータの再生を一時停止する。再生の再開には restart() を用いる。一時停止されたときに
リスナーが登録されていれば、リスナーに AUDIO_PAUSED イベントを通知する。データの再生
が停止しているときにこのメソッドが呼ばれても何もしない。端末やメディアデータの種類によっ
てサポートされない場合がある。
■
public void restart()
DoJa2.0
pause() で一時停止したメディアデータの再生を再開する。再生が再開されたときにリスナーが登
録されていれば、リスナーに AUDIO_RESTARTED イベントを通知する。停止している時にこの
メソッドが呼ばれても何もしない。端末やメディアデータの種類によってサポートされない場合が
ある。
主要メソッドの詳細
■
setSyncEvent(int channel, int key)
DoJa2.0
同期イベントを発生させるには、このメソッドを呼び出す前に setAttribute() の第一引数に Audio
Presenter.SYNC_MODE を、第二引数に AudioPresenter.ATTR_SYNC_ON を指定して呼び出す
必要がある。その後、このメソッドで設定すると、リスナーが登録されている場合、設定された
ノートメッセージに対応する音が鳴るのと同時にイベントタイプ AUDIO_SYNC でリスナーが起
動されるようになる。
だだし、AudioPresenter オブジェクトには 1 つの同期イベントのみ設定可能であるため、複数回
呼び出して設定した場合、最後の設定のみが有効になる。同期イベント(AUDIO_SYNC)の発生の
最小間隔は 100ms であるため、100ms 以内に発生した AUDIO_SYNC イベントは破棄される。引
数で指定されたチャンネル、キーが端末サポート外の場合、このメソッドを呼び出しても何も行わ
れない。
com.nttdocomo.ui
Button
クラス
このクラスは、Panel に配置するラベル付きのプッシュボタンを定義します。ラベル文字列は
ボタン中央に配置されます。
インスタンスが生成された時点では、可視状態でユーザー操作可能となっています。表示の可
否を設定するには setVisible() を、ユーザー操作の可否を設定するには setEnabled() を用います。
requestFocus() は、ボタンにフォーカスを合わせるように要求しますが、パネルに追加される
前に発行された要求は無視されます。ボタンが押されたとき、Button オブジェクトが配置され
ている Panel オブジェクトに ComponentListener が登録されていると、リスナーオブジェクトの
componentAction() が呼び出されます。
189
com.nttdocomo.ui
引数:time 再生を開始する位置(単位はメディアデータの先頭からのミリ秒)
ADF ファイルのエントリ
※太字のエントリ名は、ADF ファイルでの必須項目を示す。網かけ部分は DoJa2.0 からの追加および変更点
エントリ名
値
目的
AppName
アプリケーション名。最大 16
バイトの日本語を含む任意の
文字列を指定
携帯電話で表示されるアプリケーション名に使用される
AppClass
クラス名。大文字小文字の区
別あり
ここに指定したクラスがメインクラスとして使用される。
IApplication クラスのサブクラスを必要ならばパッケージ
名を含めて指定する
AppSize
ファイルサイズ
PackageURL エントリに指定した jar ファイルのサイズを
バイト単位で指定する
PackageURL
URL
(最大 255 バイト)
ADF ファイルに対応する jar ファイルへの URL を指定す
る。相対パスを指定した場合、ベースディレクトリは ADF
ファイルの位置となる
LastModified
日時(Dow,
DD Mon YYYY HH:MM:SS
TimeZone)
i アプリの最終更新日時。携帯電話から「アプリケーショ
ンのバージョンアップ」を実行したときの判断に使われる。
DoJa1.0 プロファイルではタイムゾーンの指定はサポート
されていないため、DoJa1.0/2.0 両者で ADF ファイルを共
有する場合、タイムゾーンは省略する
Dow
曜日(Sun, Mon, Tue, Wed, Thu, Fri, Sat)
DD
日
MM
月(Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep,
Oct, Nov, Dec)
YYYY
年
HH
時
MM
分
SS
秒
TimeZone
タイムゾーン(GMT、JST)。省略時は JST とみなす。ま
た+0900 という設定も可能
AppVer
バージョン番号
アプリケーションのバージョン管理を行う
AppParam
メインクラスのパラメータ。
スペースで区切って複数の
パラメータを指定可能。最大
255 バイト
IApplication.getArgs メソッドで取得可能なパラメータを
指定する。省略時はパラメータなしとして扱われる。ASCII
文字のみ指定可
ConfigurationVer J2ME コンフィグレーション
バージョン
(KvmVer)
(書式:CLDC-x.x)
i アプリが対応する Configuration と Kvm のバージョン番
号を指定する。省略時はすべてのバージョンで動作するも
のとして扱われる。ConfigurationVer と KvmVer は同義
だが、1つの ADF ファイルに同時に指定することはでき
ない。KvmVer は DoJa1.0 プロファイルとの互換性のため
に用意されている。現在は CLDC-1.0 までサポートされて
いる
i アプリ実行環境のプロファ
イル
(書式:Doja-x.x)
省略時は i アプリ実行環境のすべてのバージョンで動作す
るものとして扱われる。現在は Doja-2.0 までサポートさ
れている
ProfileVer
343
ADF ファイルのエントリ
エントリ名
値
目的
SPsize
スクラッチパッドのサイズ
スクラッチパッドのサイズをバイト単位で指定する。省略
時はスクラッチパッドを使用しないものとして扱われる
UseNetwork
http
TargetDevice
ネットワーク機能を使用する i アプリで通信方式を指定
する。現在は「http」のみを指定可能(「https」使用時も
「http」を指定)
。省略時は i アプリからネットワーク接続
はできなくなる
携帯電話の機種名
(最大 128 バイト)
特定の機種でのみ動作可能な i アプリの場合、ターゲット
となる機種名を指定する。すべての機種をターゲットとす
るときは、エントリ自体を記述しない
LaunchAt
時間間隔(書式:I hh)
MyConcierge
Yes
値に"Yes"が指定された場合のみ、待ち受けアプリケーショ
ンとして利用可能
UseTelephone
call
値に"call"が指定された場合のみアプリケーションが音声発
信機能(com.nttdocomo.util.Phone.call())を使用可能
UseBrowser
launch
値に"launch"が指定された場合のみ com.nttdocomo.ui.
IApplication.launch() を用いてブラウザを起動するこ
とが可能。ただし、待ち受け実行されているアプリケー
ションではブラウザ起動不可
LaunchByMail
送信元メールアドレス
メールからアプリケーションを起動することを許可する。
値に ASCII 形式で指定されたメールアドレス(1つのみ)
が後方一致比較の結果として送信元メールアドレスにすべ
て含まれていた場合のみ起動可能。値が"any"ならばすべ
てのメールから起動可能
LaunchByBrowser
Web ページの URL
ブラウザからアプリケーションを起動することを許可す
る。値に ASCII 形式で指定された URL(1つのみ、最大
255 バイト)が前方一致比較の結果として表示中 URL に
含まれていた場合のみその Web ページから起動可能。値
が"any"ならばすべての Web ページから起動可能
hh
AllowPushBy
AppTrace
344
起動コマンド
(書式:Irda:<command>)
on
ダウンロードされた時間から自動起動を行う間隔を時間単
位で指定する。省略時は自動起動は行われない(例:I 6
(6 時間おきに実行)
)
時間
赤外線ポートからの vTrigger オブジェクト受信によって
アプリケーションを起動することを許可する。command に
指定された起動コマンドが起動要求を行った vTrigger オ
ブジェクトの起動コマンドと完全一致した場合のみ起動可
能。ただし起動コマンドには空白文字が含まれていないこ
と
開発の段階で、携帯電話上で簡易デバッグ機能を提供する
ためのキー。値に"on"を指定すると有効になる。
● キャッチされない例外によりアプリケーションが異常終
了した場合にその時の例外を表示
● アプリケーションから標準出力または標準エラー出力に
出力した文字列をロギングし、アプリケーション終了時に表
示させる(最大 512 バイト。新しく書き込まれたものから順
に制限範囲内のものを表示)
。java.lang.printStackTrace()
の結果は保存されない。
開発が終了したら ADF から削除すること
ADF ファイルのエントリ
エントリ名
DrawArea
GetSysInfo
値
画面サイズ
(書式:<width>x<height>)
width は横方向、height は縦
方向のドット数"x"は小文字の
み有効
yes
目的
アプリケーションが前提としている画面サイズ(描画エリ
アサイズ)を指定。大きな描画エリアを持つ携帯電話で小
さい描画エリアを前提としたアプリケーションを実行する
と、センタリングされた指定サイズの矩形領域内でアプリ
ケーションが実行される。矩形領域外の領域に対し描画処
理を行うことはできない(領域外の色は機種依存)。
width の設定可能最小値は 96。height は 72。このキーで
指定された width、height よりも小さいサイズを持つ携帯
電話はこのアプリケーションをダウンロードすることがで
きない。サイズ省略時は携帯電話の描画エリア全体を使用
して実行する
アプリケーションが携帯電話のアイコン情報(DoJa2.0
プロファイルではメール・メッセージの受信状態のみ)
を 参 照 す る こ と を 宣 言 す る 。こ の キ ー に"yes"が 指 定
されているアプリケーションをダウンロードすると、
アプリケーションのアイコン参照を許可するかユー
ザーに確認を求める。キーを"yes"に指定し、かつユー
ザーが許可した場合のみ参照可能。受信状態の取得に
は com.nttdocomo.ui.PhoneSystem.getAttribute() を
用いる
ADF ファイルの記述にあたっての注意事項
●
ADF ファイルは、シフト JIS コードのテキストファイルで、ファイルの拡張子に「.jam」を
指定する
●
1つのキーエントリは1行で記述し、大文字/小文字の違いに注意する
●
ADF ファイルの最終行は、必ず改行する。改行コードではなく「EOF」で終了している場合
は、機種によって正常にダウンロードできない場合がある
●
AppSize の上限は 30720、SPsize の上限は 102400 までとされている。上限を超えた値が指定
されていると jar ファイルが読み込まれない場合がある
●
アプリケーションの更新に伴い、ADF ファイルを更新する際は、以下の点に注意する
−AppName キーと PackageURL キーの値は変更しない
−LastModified キーに前バージョンより新しい日付を設定する
−SPSize キーの値は、前バージョンより小さい値は設定しない
345
機種実装依存一覧
主要機種のシステム情報
スペック
P504i
F504i
N504i
So504i
D504i
プラットフォーム名
P504i
F504i
N504i
SO504i
D504i
画面の横幅(ピクセル)
132
132
160
128
132
画面の縦幅(ビクセル)
144
136
180
128
144
表示できる色数
65,536
65,536
65,536
65,536
65,536
利用可能な全メモリ(バイト)
1536,000
1024,000
557,056
1048,576
1024,000
空きメモリ容量(バイト)
1508,556
1007,728
544,016
1019,300
1004,500
Java ヒープ容量(バイト)
1500,000
1000,000
544,000
1000,000
1024,000
ネイティブデータヒープ容量(バイト)
−
−
600,000
−
524,000
※ Java ヒープとは Java のオブジェクトなどが格納されるヒープ領域のこと。
※ ネイティブデータヒープとはメディアデータや画面表示のためのリソースを格納するヒープ領域のこと。
なお、Java ヒープとネイティブデータヒープの区別がない場合は、メディアデータや画面表示のためのリソースは Java
ヒープに格納される。
■
System.getProperty("microedition.encoding") の値
文字のエンコーディングは、P504i/F504i/N504i/So504i/D504i とも「SJIS」が返る。
■
System.getProperty("microedition.configuration") の値
コンフィギュレーションは、P504i/F504i/N504i/So504i/D504i とも「CLDC-1.0」が返る。
■
System.getProperty("microedition.profiles") の値
コンフィギュレーションは、P504i/F504i/N504i/So504i/D504i とも「DoCoMoProfile-2.0」
が返る。
347
主要機種 API 実装一覧
※種別の項目はそれぞれ、STD:基本 API、OPT:オプション API、EXT:拡張 API を意味する
i アプリ基本パッケージ内に追加されているオプション API/拡張 API
com.nttdocomo.ui.AudioPresenter
N
SO
D
P
F
EMU
種別
参照
static int ATTR_SYNC_OFF
○
×
○
○
○
○
OPT
P.184
static int ATTR_SYNC_ON
○
×
○
○
○
○
OPT
P.184
static int AUDIO_SYNC
○
×
○
○
○
○
OPT
P.184
static int MAX_PRIORITY
○
×
○
○
○
○
OPT
P.184
static int MIN_PRIORITY
○
×
○
○
○
○
OPT
P.184
static int NORM_PRIORITY
○
×
○
○
○
○
OPT
P.184
static int PRIORITY
○
×
○
○
○
○
OPT
P.184
static int SYNC_MODE
○
×
○
○
○
○
OPT
P.184
static int AUDIO_PAUSED
○
○
×
×
○
○
OPT
P.184
static int AUDIO_RESTARTED
○
○
×
×
○
○
OPT
P.184
void pause()
○
○
×
×
○
○
OPT
P.184
void play(int time)
○
○
×
×
○
○
OPT
P.184
void restart()
○
○
×
×
○
○
OPT
P.184
void setData(MediaData data)
×
×
×
×
×
○
OPT
P.184
void setSyncEvent(int channel
,int key)
○
×
○
○
○
○
OPT
P.184
com.nttdocomo.ui.Display
N
SO
D
P
F
EMU
種別
参照
static int KEY_LOWER_LEFT
×
×
○
×
×
×
OPT
P.201
static int KEY_LOWER_RIGHT
×
×
○
×
×
×
OPT
P.201
static int KEY_PAGE_DOWN
×
×
×
×
×
×
OPT
P.201
static int KEY_PAGE_UP
×
×
×
×
×
×
OPT
P.201
static int KEY_UPPER_LEFT
×
×
○
×
×
×
OPT
P.201
static int KEY_UPPER_RIGHT
×
×
○
×
×
×
OPT
P.201
com.nttdocomo.ui.Font
N
SO
D
P
F
EMU
種別
参照
static int FACE_MONOSPACE
×
×
×
×
×
×
OPT
P.205
static int FACE_PROPORTIONAL
×
×
×
×
×
○
OPT
P.205
static int FACE_SYSTEM
○
○
○
○
○
○
STD
P.205
static int SIZE_LARGE(※1)
○
○
○
○
○
○
OPT
P.205
static int SIZE_MEDIUM(※2)
○
○
○
○
○
○
STD
P.205
static int SIZE_SMALL(※3)
×
○
×
○
×
○
OPT
P.205
static int STYLE_BOLD
×
×
×
×
×
○
OPT
P.205
static int STYLE_BOLDITALIC
×
×
×
×
×
○
OPT
P.205
349