カメラを使って静止画データの取得(S!アプリ)StorageConnection抜き

この方法で実現可能なこと

  • ここに書かれていること

プラス

  • JarファイルにStorageConnectionを含めない
MIDP javax.microedition.io.Connector javax.microedition.io.InputConnection
JSCL-1.2.X以降またはMEXA1.0以降 com.j_phone.io.CameraConnection

サンプルソース

CameraConnection cc = (CameraConnection)Connector.open("camera:");
cc.capture();
String filename = cc.getFileName();
cc.close();
InputConnection storageConnection = (InputConnection)Connector.open("file://" + filename);
InputStream is = storageConnection.openInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buff=new byte[1024];
int size;
while ((size=is.read(buff))!=-1) {
	baos.write(buff,0,size);
}
baos.flush();
baos.close();
is.close();
storageConnection.close();
byte[] data = baos.toByteArray();

JADファイル

カメラ機能とファイル機能へのアクセスは、セキュリティに引っかかるので「MIDlet-Permissions」の記載が必要

MIDlet-Version: 1.0
MicroEdition-Profile: MIDP-2.0
MicroEdition-Configuration: CLDC-1.1
MIDlet-Permissions: com.j_phone.io.Connector.CameraConnection.capture,com.j_phone.io.Connector.StorageConnection.read
MIDxlet-API: JSCL-1.2.2

結果

byte[]のdataに撮影画像のバイナリが格納される

解説

こことの違いは「Connector.open("file://" + filename)」で得られるオブジェクトにアクセスする際にcom.j_phone.io.StorageConnectionのスーパーインタフェイスにあたるjavax.microedition.io.InputConnectionインタフェースを使用するという点。

カメラで撮影した画像を取得する場合、該当ファイルのInputStreamがひらければ事足りるので、StorageConnectionまで使用する必要がない。

この方法ならば、Jarファイル内を見た限りではStorageConnectionを呼び出した事がわからないため、ネットワーク機能をあわせて使いたい場合などは有効な手段となる。

ただ、S!アプリのダウンロード時に、端末内データへのアクセス許可を設定する必要があるため、JADファイルには「com.j_phone.io.Connector.StorageConnection.read」の記述が必要(911Tで検証)。