DoJaによるiアプリの開発入門(3)
メディアリソースを利用して絵と音のあるiアプリ作成
服部隆志
http://www.sinsen.org/
http://www.ngy1.1st.ne.jp/~takashi/sinsen_index.html
2001/6/1
前回の「実機で動作するiアプリの作成」では文字を書くだけの地味なアプリの作成でしたが、今回は少し派手にCanvas型アプリで、「絵と音」そして携帯特有の機能「バックライトとバイブレータ」を使う方法をご紹介したいと思います。
iアプリでは、iモードで表示できるGIFファイル、着信音などに利用されるMLDファイル(着メロ)などのリソースファイルが標準で利用できます。ただし、ここで利用できるGIFやMLDファイルはiモードの機能をJavaから利用しているため、機種によっては正常に表示できないファイル、再生できないファイルがあります。同様に表示される発色や、再生される音色・テンポなどにも機種依存の部分があります。しかし実際は通常のGIFファイル、503iシリーズ対応のMLDファイルであればiアプリで利用できると考えて大丈夫なので安心してください。
■ソースの記述
前回同様にJ2ME Wireless SDK for the DoJa(以下Doja)での開発を前提としますので、新規プロジェクトとして「MediaTest」を作成し、リスト1のソースをメモ帳などのテキストエディタを使って記述後、MediaTest.javaと名前を付けて保存してください。
import com.nttdocomo.ui.*;
import com.nttdocomo.io.*;
public class MediaTest extends IApplication
{
public void start()
{
Display.setCurrent(new MediaCanvas());
}
}
class MediaCanvas extends Canvas
{
Image image = null;
AudioPresenter audio = null;
public MediaCanvas()
{
setSoftLabel(Frame.SOFT_KEY_1,"終了");
setSoftLabel(Frame.SOFT_KEY_2,"再生");
image = getResourceImage("test.gif");
MediaSound sound = getResourceSound("test.mld");
audio = AudioPresenter.getAudioPresenter();
audio.setSound(sound);
}
public void paint(Graphics g)
{
g.drawImage(image,0,0);
}
Image getResourceImage(String resource)
{
Image image = null;
try{
MediaImage mediaImage = MediaManager.getImage("resource:///"+resource);
mediaImage.use();
image = mediaImage.getImage();
}catch(ConnectionException ce){
image = null;
}catch(UIException e){
image = null;
}
return image;
}
MediaSound getResourceSound(String resource)
{
MediaSound sound = null;
try{
sound = MediaManager.getSound("resource:///"+resource);
sound.use();
}catch(ConnectionException ce){
sound = null;
}catch(UIException e){
sound = null;
}
return sound;
}
public void processEvent(int type,int param)
{
if(type==Display.KEY_PRESSED_EVENT)
{
if(param==Display.KEY_SOFT1)
{
(IApplication.getCurrentApp()).terminate();
}
if(param==Display.KEY_SOFT2)
{
audio.play();
}
}
}
} |
リスト1 MediaTest.java |
このプログラムではgetResourceImage()、getResourceSound()メソッドでそれぞれのメディアリソースのインスタンスをJARリソースから入手しています。また、MediaManager.getXXX("resource:///xxx")の引数にあたる"resource:///xxx"という部分のことをGeneric
Connectionと呼び、URLのように[プロトコル://パス]という表記法で今回のJARリソース以外にもHTTPやスクラッチパッド(永続データ保存)にもアクセスすることができます。このGeneric
Connectionについては、次回に詳しく紹介したいと思います。
■ビルド
ソースの記述を済ませたら、前回のようにsrcフォルダ(C:\J2MEWSDK4DOJA\apps\MediaTest\src)にコピー、ビルドするのですが、別に用意したリソースファイル(test.gif、test.mld)をresフォルダ(C:\J2MEWSDT4DOJA\apps\MediaTest\res)にコピーしてください。この状態でビルドすることでJARファイルにリソースファイルが追加されます。
ビルドが正常に終了したら、DoJaにあるエミュレータで動作チェックしたいところですが、残念なことにエミュレータがMLDファイルの再生機能を持っていないため実行することができません。
■実機での実行
前回と同様にiアプリをダウンロードするためのHTMLを作成し、それぞれをサーバにアップロードします。実機で、作成したHTMLファイルにアクセスしてiアプリをダウンロードし、実行してみます。
注意:サウンドが再生された状態でさらに連続して実行しようとすると、エラーが出たり動作が不安定になる機種があるので注意してください。 |
<html>
<head>
<title>MediaTest</title>
<object declare id="application" data="MediaTest.jam"
type="application/x-jam"></object>
</head>
<body>
MediaTest
<hr>
<a ijam="#application" href="temp.html">MediaTest</a><br>
</body>
</html> |
リスト2 ダウンロード用のHTMLファイル |
すでに実機で実行された方はお気付きになられたと思いますが、前回のアプリも今回のアプリも、実行するとバックライトが消えているため画面が暗いままです(一部の機種では標準でアプリ実行中にボタン操作があると自動的にバックライトが点灯します)。そこでiアプリの方からPhoneSystemというクラスを使い、バックライトの点灯を実行してみます。また機種依存ですが、PhoneSystemを使いバイブレータを動作させることができますので、サウンド再生の代わりにバイブレータを作動させてみましょう。iアプリを実行している機種の判別情報は
System#getProperty("microedition.platform") |
で入手できます。どの機種でバイブレータが作動するか、機種判別情報の値は表1を参照してください。
機種名 |
機種判別情報 |
設定値オン |
設定値オフ |
P503i |
Panasonic P503i |
120,1 |
120,0 |
P503iS |
Panasonic P503iS |
120,1 |
120,0 |
F503i |
f50x |
64,65 |
64,64 |
N503i |
pdc |
操作方法が発見されていません |
操作方法が発見されていません |
D503i |
D503i |
操作方法が発見されていません |
操作方法が発見されていません |
表1 PhoneSystemを使ったバイブレータの動作設定値と機種判別情報 |
■ソースの修正
ソースの修正は、リスト3のようになります。
import com.nttdocomo.ui.*;
import com.nttdocomo.io.*;
public class MediaTest2 extends IApplication
{
public void start()
{
Display.setCurrent(new MediaCanvas());
}
}
class MediaCanvas extends Canvas
{
Image image = null;
AudioPresenter audio = null;
public MediaCanvas()
{
setSoftLabel(Frame.SOFT_KEY_1,"終了");
setSoftLabel(Frame.SOFT_KEY_2,"再生");
image = getResourceImage("test.gif");
// バックライトを点灯させる
PhoneSystem.setAttribute
(PhoneSystem.DEV_BACKLIGHT,PhoneSystem.ATTR_BACKLIGHT_ON);
MediaSound sound = getResourceSound("test.mld");
audio = AudioPresenter.getAudioPresenter();
audio.setSound(sound);
}
public void paint(Graphics g)
{
g.drawImage(image,0,0);
}
Image getResourceImage(String resource)
{
Image image = null;
try{
MediaImage mediaImage = MediaManager.getImage("resource:///"+resource);
mediaImage.use();
image = mediaImage.getImage();
}catch(ConnectionException ce){
image = null;
}catch(UIException e){
image = null;
}
return image;
}
MediaSound getResourceSound(String resource)
{
MediaSound sound = null;
try{
sound = MediaManager.getSound("resource:///"+resource);
sound.use();
}catch(ConnectionException ce){
sound = null;
}catch(UIException e){
sound = null;
}
return sound;
}
public void processEvent(int type,int
param)
{
if(type==Display.KEY_PRESSED_EVENT)
{
if(param==Display.KEY_SOFT1)
{
(IApplication.getCurrentApp()).terminate();
}
if(param==Display.KEY_SOFT2)
{
// バイブレータを作動させる
String platform =
System.getProperty("microedition.platform");
if(platform.equals("Panasonic
P503i")||platform.equals("Panasonic P503iS"))
{
PhoneSystem.setAttribute(120,1);
}
else if(platform.equals("f50x"))
{
PhoneSystem.setAttribute(64,65);
}
else if(platform.equals("SO503i"))
{
PhoneSystem.setAttribute(64,1);
}
else
{
// バイブレータが作動できない機種ではサウンドを再生する
audio.play();
}
}
}
}
} |
リスト3 バックライトとバイブレータを動作させるようにしたMediaTest2.java |
更新されたJARファイルとJAMファイルをサーバにアップロードし、実機で先ほどのiアプリのバージョンアップを行うと内容が更新されます。
このプログラムではバックライトの点灯、バイブレータの作動ともに実行されたままなので、停止させるにはiアプリを終了させてください。また、サウンドの実行を連続した場合と同じくバイブレータの作動を連続して実行すると、一部の機種で動作が不安定になりますので注意してください。
このプログラムを改造してバイブレータとサウンドの再生を同時に実行させようとした場合、一部の機種ではどちらか一方だけしか実行されないことがあります。
今回も一部でGeneric Connectionという機能を使いましたが、次回はこのGeneric Connectionを使い、ネットワーク・スクラッチパッドの利用方法を紹介します。
|