![]() |
![]() |
|
Loading
|
@IT > Master of IP Network > Mobile Connection > 互換性のあるiアプリ作成法 |
DoJaによるiアプリの開発入門(6)
本来であれば、Java言語で作られたプログラムは同じ仕様のすべてのプラットフォームで同じように動作することが期待されます。しかし、実際には、これまでの連載で紹介してきたサンプルのiアプリにも、機種によって問題の発生する可能性があるものがありました。これらの原因は、1つのプラットフォーム上で動作するJava実行環境を端末メーカーごとに開発しているためで、同じ仕様をもとにしたとしても実装上の違いが出てしまうからです。 J-フォンやKDDIでは、この問題に対処するため、端末で使用するJava実行環境を統一しています*1。DoJaでもこのような環境が整えばいいのですが、すでに発売されている503iシリーズでは無理なので、それらの違いにどう対処するかが、iアプリを作るにあたっての大きな問題となります。 今回は、現在発売されている503iシリーズで、問題となる主な機種依存個所とその対応策を知り、互換性のあるiアプリを作成する方法を紹介します。
現在発売されているすべてのiアプリ対応携帯端末で動作するiアプリを作るには、各端末の特徴を知り、それによって制限される部分を明確にする必要があります。 例えば、SO503iでは操作ボタンの上下がジョグダイヤルになっているので、操作キーのオン・オフ状態が非常に短い時間に連続して実行され、またボタンの押しっぱなしという状態の判定ができません。このためSO503iと互換性を保つ場合は、操作ボタンのほかに数字キーでも操作できるようにした方がよい場合があります。 表1に各端末の持つ特徴を示します。赤で表示されている部分が、互換性を保つときに注意すべき個所です。プログラムを作成する前に、これらの個所への対策を考えたり、これらの個所を最低スペックとした設計をする必要があります。なお表1中の「microedition.platform」は、System#getProperty("microedition.platform")を実行すると入手できる値で、これにより機種の判別をして機種限定のプログラムを実行させることができます。
さて、それでは、それぞれの特徴について詳しくみていくことにします。 ●色数 P503i(S)、F503iでは固定の256色しか表示することができません。これにより本来表示させたい色が近似されて思いどおりの色で発色されないことがあります。特にグラデーションを表示させたい場合や、Canvas#getColorOfRGB(int,int,int)で色を指定したい場合には注意が必要です。違う色を指定しているはずが、実機では同じ色だったということがあります。 ![]()
●画面サイズ SO503iでは正方形、D503iでは横長という特徴があります(そのほかの機種は縦長です)。縦120ドット以上で画像や文字を表示すると、SO503iでは欠けたり表示されなかったりします。またD503iでは横のサイズが異なるため、画像や文字が思った位置に表示されなかったり、画面の縁に空白が残ったりします。 ![]()
●フォントサイズ SO503iとD503iは、標準で使用するフォントサイズが異なります。そのため、文字を並べて表示すると、文字が重なることがあります。 ![]()
●ボタン形状 SO503iではボタンの上下にジョグダイヤルが使われています。ジョグダイヤルによる操作ではボタンのオン・オフが一瞬のうちに終わってしまうため、上下ボタンの押しっぱなしができないだけでなく、プログラムのメインループでボタンの状態を入手している場合は取りこぼす可能性があります。 またP503i(S)ではスティックになっており、上下左右のうち1カ所だけが押された状態しか入手することができず、ボタンの同時押しが判定できません。同様にN503i、D503iでも一部のボタンの同時押しの判定ができなくなっています。 ![]()
●ヒープメモリサイズ 互換性を考える場合に優秀な成績を持つN503iが唯一問題とするのが、このヒープメモリのサイズです。大きな配列や多くのリソースを扱う場合は注意が必要です。 ただし、リソースに関してはリソース管理のプログラムが優秀であることからそれほど苦にすることはありません。むしろリソースの管理が特殊なSO503iの方に、注意が必要な場合があります。 ![]()
次に、実装されているバーチャルマシンによる違いを説明します。 ●Panel上のGUI表示 DoJaでは、標準でのGUIの表示位置、方法などは機種依存になっています。これにより、機種が違うことで思ったように表示されていないことがあります。 ![]() ●Panelの切り替えとフォーカス N503iなどでは、ほかのフレームからキー操作のKeyPressedイベントに反応してPanelに切り替えたとき、Panel上のGUIにKeyReleasedイベントが渡されてしまう場合があります。これにより意図しない場面でGUIが選択されてしまいます。 ![]() ●Canvas#repaint()のタイミング 機種によって、新たに再描画用スレッドを作成するタイプ(F503i、SO503i、D503i)と、repaint()内部で直接paint(Graphics)が実行されるタイプ(P503i(S)、N503i)の2つに分かれます。新たなスレッドが作成される場合は、前の描画と処理が重なる可能性があり、その場合に前の処理が中止されたり、プログラムによっては例外エラーが発生することがあります。特に中止される場合には、必要な描画まで中止されてしまうことがあるので注意が必要です。 ![]()
ほかに、Canvas#getGraphics()で実画面のインスタンスを入手したら、それを使って直接描画処理を実行する方法があります。実際の画面に反映されるタイミングはCanvas#lock()、Canvas#unlock(boolean)を使って調節できます。この方法では、paint(Graphics)を一切使うことなく描画することができます(Canvas#paint(Graphics)はabstructなので実装する必要はあります)。
●リソースの扱い SO503iではMediaResourceの扱いがほかの機種と異なり、意図的にリソースの破棄をしないとメモリ上に存在し続けます。これによりメモリが使われて足りなくなることがあります。大きな画像を何十個も扱う場合や、ネットワークなどから更新される画像を次々に生成する場合などは注意が必要です。 ![]()
●PhoneSystemの連続実行 P503i(S)やSO503iでは、PhoneSystemによるハードウェアへのアクセスを短時間に連続して実行すると動作が不安定になったり強制終了されることがあります。また、P503i(S)でバイブレータの設定と音の再生を同時に行うと、どちらか一方しか実行されないことがあります。 ![]() ●音の停止と再生 音の再生中に停止させ、すぐに別の音を再生しようとすると、多くの機種で正常に再生が行われません。P503i(S)の場合は次の再生が処理されず、N503iとSO503iの場合は例外(エラー)が発生することがあります。 ![]() ●最小時間の計測 DoJaで時間を計測する手段としては、System#currentTimeMillis()を利用する場合と、ShortTimerなどのタイマを利用する場合の2つがあります。しかし、N503iではSystem.currentTimeMillis()の精度が100ms単位までしか使えません。ShortTimerではF503iとSO503iで100ms単位の精度しかありません。つまり互換性を保ちつつ計測できる最小時間の単位は100msまでということになります。 ![]()
バグ、もしくはバグとして公表されているものではありませんが、実際の運用上でバグではないかと思われるものについての対応策を紹介します。 ●N503iのGETを使ったCGI連携 DoJaの仕様では、ネットワークにはシフトJISを使うことが決められていますが、N503iではGETを使ったCGIへのデータ送信時にのみ正しくエンコードされないため、CGI側でデータを入手できないことがあります。 ![]()
●P503iの4月問題 P503iではJAMに4月を「Apr」と書いた場合にエラーが発生することが確認されています(http://www.nttdocomo.co.jp/i/java/caution.html)。 ![]() ●SO503iのバージョンアップによるSPsizeの拡大禁止 「HTTP通信とスクラッチパッドへのアクセス」でも書きましたが、SO503iでiアプリのバージョンアップをする場合、スクラッチパッドに割り当てるサイズを以前より多くすることで他のアプリケーションのデータを破壊してしまうことがあります。 この問題に対しては、現在ドコモショップにて修正機との交換が開始されています。セキュリティ的な問題もあるので、以前からのSO503iユーザーは必ず交換してください。詳しくは「DoCoMo by Sony SO503i 」をご愛用のお客様へ(お知らせ)をご覧ください。 ![]()
今回は互換性を保つために注意すべき機種依存とその対策法を紹介しました。次回は、JARで10Kbytesというサイズ制限の中に、よりたくさんの内容を詰め込むためのファイルサイズ縮小方法についてご紹介したいと思います。 次回、「ファイルサイズ縮小方法」編の掲載は8月下旬ごろを予定しています
|
![]() |
|
Copyright © ITmedia, Inc. All Rights Reserved.
|