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

CameraConnectionで実現可能なこと

  • ネイティブシステムがサポートする撮影用のパラメータの取得
  • 撮影用パラメータの取得および設定
  • フレーム画像の設定
  • 撮影データの取得
MIDP javax.microedition.io.Connector
JSCL-1.2.X以降またはMEXA1.0以降 com.j_phone.io.CameraConnection com.j_phone.io.StorageConnection

サンプルソース

CameraConnection cc = (CameraConnection)Connector.open("camera:");
cc.capture();
String filename = cc.getFileName();
cc.close();
StorageConnection sc = (StorageConnection)Connector.open("file://" + filename);
byte[] data = new byte[(int)sc.getLength()];
InputStream is = sc.openInputStream();
is.read(data);
is.close();
sc.close();

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

IllegalArgumentException - パラメータが無効または誤りのある場合に throw します。
ConnectionNotFoundException - 要求された url に対応する接続が行い無い場合あるいは指定されたプロトコル名がデバイスによってサポートされない場合に throw します。
IOException - 上記以外の何らかの例外が発生した場合に throw します。

Connector#close

IOException

CameraConnection#caputure

IOException - ネイティブシステムでサポートしていない画像サイズ、画像保存形式、画像品質が指定された場合、または撮影時にエラーが発生した場合に発生する。

StorageConnection#getLength

IOException - 以下の場合に発生する

  • コネクションが閉じている
  • 指定されたファイルまたはフォルダが存在しない、または Java アプリケーションから不可視
  • その他の入出力エラー
StorageConnection#openInputStream

SecurityException - アクセスの制限された Java アプリケーションから呼び出された場合、または著作権保護データファイルの場合に発生する
java.io.IOException - 以下の場合に発生する

  • Connector.open() の引数modeに Connector.WRITEが指定された
  • コネクションが閉じている
  • 指定されたパス名がルートまたはフォルダを示している
  • 指定されたファイルが存在しない、または Java アプリケーションから不可視
  • 指定されたファイルまたは他のファイルに対してストリームが開いている
  • その他の入出力エラー
InputStream#read

IOException - 入出力エラーが発生した場合

InputStream#close

IOException - 入出力エラーが発生した場合

解説

Connectorクラスのopenメソッドに「camera:」スキームを指定することでCameraConnectionインタフェースを実装したオブジェクトを取得できる。ここで使う「CameraConnection」「StorageConnection」は、ともに「javax.microedition.io.Connection」を継承しているので、Connectorクラスから生成することになる。

その後、CameraConnectionインタフェースのcaptureメソッドで撮影、同インタフェースのgetFileNameメソッドにより、撮影データのファイル名を取得できる。Connectionインタフェースのcloseメソッドを呼び出すことで、カメラ機能を終了する。

最後に取得したファイル名を元に、StorageConnectionオブジェクトを利用してファイルにアクセスし、InputStreamオブジェクトを通してデータを取得する。

なお、CameraConnectionオブジェクトを取得した後に撮影画像のサイズ、保存形式、画像品質、フレーム画像を指定してから撮影することも可能で、カメラ動作時はアプリのスレッドは停止した状態となる。

なお、エミュレータでは「StorageConnection sc = (StorageConnection)Connector.open("file://" + filename);」の部分で「java.io.IOException(invalid root)」が発生する。おそらく「filename」に「c:\…」が入っていることが原因と思われる。(端末上のパスは機器内部のデータフォルダであれば「/ms/…」となるはずなので)

上記ソースは実機(911T)で動作確認済み。

※スキーム・・・URLの「http:」や「resource:」や「file:」などの部分

関連キーワード

OpticalDeviceConnection
VideoConnection