Loading
|
@IT > Master of IP Network > Mobile Connection > HTTP通信とスクラッチパッドへのアクセス |
DoJaによるiアプリの開発入門(4)
Java対応携帯電話の特徴の1つとして、「ネットワークとの親和性」があります。これは携帯電話自身がネットワークアダプタとしての機能を持っていることと、Java言語の仕様がネットワークの利用を容易に行えるようになっているためです。特にJ2ME CLDC(Connected Limited Device Configuration)環境では、パッケージjavax.microedition.ioにGeneric Connection Framework(以下Generic Connection)という、ネットワークを簡単に扱うための仕様が用意されています。DoJaはJ2ME CLDCをベースに構築されているため、この仕様を使い簡単にそれぞれのネットワークにアクセスすることができます。 今回は、このGeneric Connectionを利用して、HTTP通信とスクラッチパッドへのアクセスを行うサンプルプログラムを作成します。
Generic Connectionではjavax.microedition.io.Connectorクラスにネットワークを表すURLを与えることで、そのネットワークへの接続(実際はjavax.microedition.io.Connectionインターフェイス)ができます。接続ができたら、InputStreamあるいはOutputStreamを入手し、任意にデータの送受信が可能です。Generic Connectionの仕様では、さまざまなネットワークに対応して通信できるようになっていますが、実際に使用できるネットワークは端末側の実装により制限されます。DoJaでは「HTTP/HTTPS、スクラッチパッド、リソース」が利用可能です。前回はこのリソースにあたるGeneric Connectionを利用して、JARファイル内のメディアリソースを利用しました。なお、JARファイル内のリソースへデータを書き込むことなどは当然できません。 Connectorクラスに与えるURLは、
であらわされ、HTTP通信の場合は“http://”で始まる通常のURLを与えることで接続できます。表1に、DoJaでのGeneric Connectionで使用可能なURLの例を記します。
前回は、このURLを「MediaManager#getImage("resourse:///image.gif")」などのように引数として設定しましたが、これはMediaManagerクラス内でGeneric Connectionが使われていることを意味しています。 ここで「同じGeneric Connectionなら、MediaManagerにHTTPやスクラッチパッドを指定しても動作するのだろうか?」という疑問が出てきます。もちろん、これは可能です。このような汎用性があることがGeneric Connectionの利点といえます。
スクラッチパッドとは、iアプリから使用できるバイト配列で構成されたデータの保存領域のことで、Generic Connectionで得たInputStream、OutputStreamを使って読み込み/書き込みが可能です。スクラッチパッドで使用できる領域サイズは、JAMファイルのSPsizeで指定されたバイト数によって設定され、実機ではJAMファイルを参照して、各iアプリごとにスクラッチパッド用の領域を確保します。SPsizeに設定できる最大値、すなわちスクラッチパッドの最大領域サイズは、NTTドコモの仕様では5Kbytes(=5120bytes)までとなっていますが、本稿執筆時点(2001年6月16日)で発売されている全機種(P503i、P503iS、F503i、N503i、SO503i、D503i)で10Kbytes(=10240bytes)となっています。しかし、これは携帯機器メーカーの独自設定であり、今後5Kbytesを上限とする機種が出てくる可能性はありますし、大きく設定することでユーザー側の負担も大きくなってしまいます。開発者としては可能な限り少なくなるよう努力するべきでしょう。 また、Generic ConnectionのURL表示では“scratchpad:///0”までが固定され、それ以降の“;pos=0”という部分でバイト配列のオフセットが指定できるようになっています。例えば、“scratchpad:///0;pos=64”と指定した場合にInputStreamを得ると、そのInputStreamで入手される最初の値は保存領域の64bytesからの値となります。
では、実際にHTTP通信とスクラッチパッドを利用したサンプルプログラムを作ってみます。内容は、Panel型アプリを使い、HTTP通信によってGIFイメージをダウンロードし、それをスクラッチパッドへ書き込み、最後にMediaManagerにスクラッチパッドのURLを指定してPanel上にイメージを表示するというものです。「MediaManagerにGIFファイルのURLを指定してやればすぐなのにどうして?」と思われるかもしれませんが、今回はGeneric Connectionに慣れるためのサンプルなので、このような複雑なサンプルにしてみました。これを応用すれば10KbytesというJARファイルサイズ制限の対策にもなります。 また、1つのIApplicationで2つのPanelを使い、その切り替えもやってみたいと思います。 ■プロジェクト作成 まず、これまでと同じようにDoJaを起動して新規プロジェクト「GCTest」を作成し、アプリケーション属性設定でAppNameとAppClassを設定します。ただし、今回はネットワークとスクラッチパッドを使用するためにUseNetworkとSPsizeの設定が必要となります。UseNetworkにhttpを、SPsizeにはスクラッチパッドに保存するデータ容量をバイト単位で設定します(図1)。今回の場合は、Panelに表示したいGIFファイルの最大のファイルサイズより大きい値を設定する必要があります。
■ソースの記述 メモ帳などのテキストエディタを使ってリスト1のソースを記述後、GCTest.javaとして保存し、先ほど作成したプロジェクトのsrcフォルダ(C:\J2MEWSDK4DOJA\apps\GCTest\srcなど)に移してください。
■事前準備とエミュレータ・実機での動作確認 ソースの記述後、ビルドが正常に終了したら、エミュレータで動作確認をします。今回はネットワーク上のGIFファイルをダウンロードするという動作が行えるかどうかをエミュレータで確認するので、事前にGIFファイルをネットワーク上の適当なサーバに用意しておく必要があります。また、エミュレータ側にもネットワークの設定が必要となります。「編集>設定」から「エミュレータの設定」というダイアログが表示されます。そこの「読み込み先URL」に先ほど準備しておいたGIFファイルがあるURLを、「NetworkAccess」を「enable」に設定してください。この設定によりエミュレータでのネットワーク動作確認が可能となります。
なお、ネットワーク、スクラッチパッド関係はDoJaの中でも特にエラーが出やすい部分です。今回は例外が発生した場合、画像の表示はせず、例外の内容をTextBoxに出力するようにしました。特にcom.nttdocomo.io.ConnectionExceptionが発生した場合は、ConnectionException#getStatus()で例外の種類が分かる数値を得ることができます。正常に動作しなかった場合は、得た数値を「iモード対応Javaコンテンツ開発ガイド(APIリファレンス編)1.0版」のConnectionExceptionフィールド一覧で調べて、原因を突き止めてください。 また、エミュレータのHTTP通信ではUserAgentが一切送られないため、サーバの設定によってはHTTPエラー(ConnectionException#getStatus()でいうと10)が発生することがあります。残念ながら、こういったサーバでは、DoJa付属のエミュレータを使ったネットワーク機能は使えません(ただし、こういったサーバでも実機での動作には支障ありません)。ほかのサーバが使用できる場合は、そちらを使用してください。 エミュレータでの正常動作が確認できたら、実機での動作確認をしましょう。どうでしょうか、正常に動作しましたか?
今回はネットワークからGIFファイルをダウンロードしてみましたが、次回はネットワークはネットワークでも、CGIとの連携を紹介したいと思います。
|
|
|
Copyright © ITmedia, Inc. All Rights Reserved.
|