パソコンサポート トップへ 「 iアプリ プログラミング 」(その11) 2004年07月02日更新

目次 前頁

16.カメラ制御

注意点:
iアプリからのカメラ機能の利用は、DoJa2.xプロファイルではオプションAPIでしたが、DoJa3.xプロファイルでは基本APIになりました。
通常、DoJa2.xプロファイルのカメラ機能を利用したiアプリは、DoJa3.xプロファイルの機種では起動できないようです。
但し、機種によっては、動作するものもあるようです。

下記のサンプルは、DoJa2.xプロファイルのサンプルです。
DoJa3.xプロファイルの場合、パッケージのインポートを変更して下さい。
  DoJa2.xプロファイル:import com.nttdocomo.opt.ui.*;
  DoJa3.xプロファイル:import com.nttdocomo.device.Camera;

<DoJa 2.x プロファイルの場合>
カメラ制御の概要は、NTTドコモ「iアプリコンテンツ開発ガイドfor504i(iアプリオプション・拡張編)」に記載されています。
詳細は、NTTドコモ「APIリファレンス(iアプリオプション・拡張API編)」に記載されています。
iアプリからカメラ制御(DoJa2.x)を利用できる機種は、504iS、及び、FOMA 2051です。

<DoJa 3.x プロファイルの場合>
カメラ制御の概要は、NTTドコモ「iアプリコンテンツ開発ガイド for DoJa-3.0 詳細編」に記載されています。
詳細は、NTTドコモ「iアプリコンテンツ開発ガイド for DoJa-3.0 APIリファレンス編」に記載されています。
iアプリからカメラ制御(DoJa3.x)を利用できる機種は、505i以降、及び、FOMA 900i以降です。

  メソッド名 メソッドの機能
  getCamera() カメラオブジェクトの取得
カメラデバイスの設定  
  setAttribute() デバイス属性の設定
  isAvailable() その携帯電話で対応している属性を判定
  getAttribute() 各属性の現在の属性値の取得
  setImageSize() 撮影画像サイズの設定
カメラ機能の起動  
  takePicture() 静止画撮影モードでカメラ機能を起動
  takeMovie() 動画撮影モードでカメラ機能を起動
撮影画像の取得  
  getImage() カメラオブジェクトに保持されている画像を、メディアイメージの形式で取得
  getInputStream() 画像をバイトストリームの形式で取得
  disposeImages() 撮影画像の破棄

サンプル 41
 カメラ起動
 ※カメラ機能の起動→撮影画像を取得→表示を行います。

実行結果
※FOMA N2051で確認
1.iアプリ起動時は、空白画面です。
2.「撮影」ボタンを押すと、
 カメラ機能の起動が行われ、
 カメラ操作画面に切り替わります。
3.撮影が終了すると、
再び、iアプリに切り替わり、
撮影画像が表示されます。
プロブラムソース "test41.java"  ソースダウンロードサイトへ
// パッケージのインポート
import java.io.*;
import com.nttdocomo.io.*;
import com.nttdocomo.ui.*;
import com.nttdocomo.opt.ui.*;

// IApplicationのサブクラスとして"test41"を宣言
// ※IApplicationは、iアプリ作成時、必須クラスです。

public class test41 extends IApplication {
  // 初期化処理
  // ※iアプリ起動時に、この"start"メソッドが呼ばれる

  public void start() {
    // "mypanel"オブジェクトを生成
    mypanel w_panel = new mypanel();
    // ソフトキー1のラベルに"終了"を設定
    w_panel.setSoftLabel(w_panel.SOFT_KEY_1,"終了");
    // ソフトキー2のラベルに"撮影"を設定
    w_panel.setSoftLabel(w_panel.SOFT_KEY_2,"撮影");
    // 現在の画面に設定
    Display.setCurrent(w_panel);
  }

  // Panelのサブクラスとして"mypanel"を宣言
  class mypanel extends Panel implements SoftKeyListener {
    // 変数の宣言
    private Camera w_camera;
    private ImageLabel w_imagelabel;

    public mypanel(){
      // カメラオブジェクトの取得
      w_camera = Camera.getCamera(0);
      // イメージオブジェクトをもつイメージラベルを作成
      w_imagelabel = new ImageLabel();
      // パネルに追加
      add(w_imagelabel);

      // イベントリスナーのインスタンス登録
      // ソフトキーリスナー

      setSoftKeyListener(this);
    }

    // ソフトキーが離されたときに実行
    public void softKeyReleased(int param){
      // ソフトキー1が離された時に実行
      if(param == this.SOFT_KEY_1){
        // iアプリ終了
        terminate();
      }
      // ソフトキー2が離された時に実行
      if(param == this.SOFT_KEY_2){
        try {
          // カメラ機能の起動
          w_camera.takePicture();
        } catch (Exception ce) {}
        // カメラオブジェクトに保持されている画像を、メディアイメージの形式で取得
        MediaImage w_media = w_camera.getImage(0);
        try {
          w_media.use();
        } catch (Exception ce) {}
        // メディアイメージからイメージオブジェクトを取得
        Image w_image = w_media.getImage();
        // ラベル画像を設定・変更
        w_imagelabel.setImage(w_image);
      }
    }
    // ソフトキーが押されたときに実行
    // ※今回は使用しないが、記述しておかないとコンパイルエラーになる

    public void softKeyPressed(int param){
    }
  }
}

サンプル 42
 カメラ撮影・保存
 ※カメラ機能の起動→撮影画像を取得→表示
   →画像をScratchPadに保存→ScratchPadから表示を
行います。(画像3個まで保存可能)

実行結果
※FOMA N2051で確認
1.iアプリ起動時は、空白画面です。
2.「撮影」ボタンを押すと、
 カメラ機能の起動が行われ、
 カメラ操作画面に切り替わります。
3.撮影が終了すると、
再び、iアプリに切り替わり、
撮影画像が表示されます。
4.撮影画像の保存
 "1","2","3"の何れかの数字キーを押すと、各キー
 に対応したScratchPadエリアに保存されます。
5.保存画像の表示
 "4","5","6"の何れかの数字キーを押すと、各キー
 に対応したScratchPadの画像が表示されます。
プロブラムソース "test42.java"  ソースダウンロードサイトへ
// パッケージのインポート
import java.io.*;
import javax.microedition.io.*;
import com.nttdocomo.io.*;
import com.nttdocomo.ui.*;
import com.nttdocomo.opt.ui.*;

// IApplicationのサブクラスとして"test42"を宣言
// ※IApplicationは、iアプリ作成時、必須クラスです。

public class test42 extends IApplication {
  // 初期化処理
  // ※iアプリ起動時に、この"start"メソッドが呼ばれる

  public void start() {
    // "mypanel"オブジェクトを生成
    mypanel w_panel = new mypanel();
    // ソフトキー1のラベルに"終了"を設定
    w_panel.setSoftLabel(w_panel.SOFT_KEY_1,"終了");
    // ソフトキー2のラベルに"撮影"を設定
    w_panel.setSoftLabel(w_panel.SOFT_KEY_2,"撮影");
    // 現在の画面に設定
    Display.setCurrent(w_panel);
  }

  // Panelのサブクラスとして"mypanel"を宣言
  class mypanel extends Panel implements SoftKeyListener,KeyListener {
    // 変数の宣言
    private Camera w_camera;
    private ImageLabel w_imagelabel;
    private TextBox w_textbox;

    public mypanel(){
      // カメラオブジェクトの取得
      w_camera = Camera.getCamera(0);
      // イメージオブジェクトをもつイメージラベルを作成
      w_imagelabel = new ImageLabel();
      // パネルに追加
      add(w_imagelabel);
      // テキストボックス(処理結果表示用)
      w_textbox = new TextBox("テキストボックス", 16, 1, TextBox.DISPLAY_ANY);
      // パネルに追加
      add(w_textbox);
      // イベントリスナーのインスタンス登録
      // ソフトキーリスナー

      setSoftKeyListener(this);
      // キーリスナー
      setKeyListener(this);
    }

    // ソフトキーが離されたときに実行
    public void softKeyReleased(int param){
      // ソフトキー1が離された時に実行
      if(param == this.SOFT_KEY_1){
        // iアプリ終了
        terminate();
      }
      // ソフトキー2が離された時に実行
      if(param == this.SOFT_KEY_2){
        try {
          // カメラ機能の起動
          w_camera.takePicture();
        } catch (Exception ce) {}
        // カメラオブジェクトに保持されている画像を、メディアイメージの形式で取得
        MediaImage w_media = w_camera.getImage(0);
        try {
          w_media.use();
        } catch (Exception ce) {}
        // メディアイメージからイメージオブジェクトを取得
        Image w_image = w_media.getImage();
        // ラベル画像を設定・変更
        w_imagelabel.setImage(w_image);
        // 結果表示
        w_textbox.setText("撮影完了");
      }
    }
    // ソフトキーが押されたときに実行
    // ※今回は使用しないが、記述しておかないとコンパイルエラーになる

    public void softKeyPressed(int param){
    }
    // キーが離されたときに実行
    public void keyReleased(Panel panel,int param){
      if (param == Display.KEY_1) {
        // 画像をScratchPad-0に取り込む
        imageSave(0);
      }
      if (param == Display.KEY_2) {
        // 画像をScratchPad-1に取り込む
        imageSave(1);
      }
      if (param == Display.KEY_3) {
        // 画像をScratchPad-2に取り込む
        imageSave(2);
      }
      if (param == Display.KEY_4) {
        // 画像をScratchPad-0から表示
        imageDisplay(0);
      }
      if (param == Display.KEY_5) {
        // 画像をScratchPad-1から表示
        imageDisplay(1);
      }
      if (param == Display.KEY_6) {
        // 画像をScratchPad-2から表示
        imageDisplay(2);
      }
    }
    // キーが押されたときに実行 ※今回は無し
    public void keyPressed(Panel panel,int param){
    }

    // 画像"w_num"をScratchPadに取り込む
    public void imageSave(int w_num) {
      // 変数の宣言
      InputStream w_in,w_sp;
      OutputStream w_out;
      byte[] w_data;
      int w_length,ww_sp=0;
      // ScratchPadの先頭1バイトに何も入っていない場合、imageファイルを読む
      try {
        // 入力ストリームを取得
        w_in=w_camera.getInputStream(0);
        // ScratchPadへの出力ストリームを取得
        w_out=Connector.openOutputStream("scratchpad:///0;pos="+w_num * 10000);
        // 入力ストリームから出力ストリーム(ScratchPad)へ、順次、書き込む
        w_data=new byte[128];
        while ((w_length=w_in.read(w_data)) != -1 ) {
          w_out.write(w_data,0,w_length);
        }
        // 入力ストリームをクローズ
        w_in.close();
        // 出力ストリームをクローズ
        w_out.close();
      }
      catch (Exception e){}
      // 結果表示
      w_textbox.setText("画像保存"+w_num);
    }

    // 画像"w_num"をScratchPadから表示
    public void imageDisplay(int w_num) {
      // ScratchPadから、メディアイメージを取得
      MediaImage w_media=null;
      try {
        w_media = MediaManager.getImage("scratchpad:///0;pos="+w_num * 10000);
        w_media.use();
      } catch (Exception ce) {}
      // メディアイメージからイメージオブジェクトを取得
      Image w_image = w_media.getImage();
      // ラベル画像を設定・変更
      w_imagelabel.setImage(w_image);
      // 結果表示
      w_textbox.setText("画像表示"+w_num);
    }
  }
}

サンプル 43
 カメラ画像の送信
 ※カメラ機能の起動→撮影画像を取得→表示
   →同時に、撮影した画像をサーバへ送信

実行結果
※FOMA N2051で確認
1.iアプリ起動時は、空白画面です。
2.「撮影」ボタンを押すと、
 カメラ機能の起動が行われ、
 カメラ操作画面に切り替わります。
3.撮影が終了すると、
再び、iアプリに切り替わり、
撮影画像が表示されます。
4.同時に、撮影した画像をサーバへ送信します。
プロブラムソース "test43.java"  ソースダウンロードサイトへ
// パッケージのインポート
import java.io.*;
import javax.microedition.io.*;
import com.nttdocomo.io.*;
import com.nttdocomo.ui.*;
import com.nttdocomo.opt.ui.*;

// IApplicationのサブクラスとして"test43"を宣言
// ※IApplicationは、iアプリ作成時、必須クラスです。

public class test43 extends IApplication {
  // 初期化処理
  // ※iアプリ起動時に、この"start"メソッドが呼ばれる

  public void start() {
    // "mypanel"オブジェクトを生成
    mypanel w_panel = new mypanel();
    // ソフトキー1のラベルに"終了"を設定
    w_panel.setSoftLabel(w_panel.SOFT_KEY_1,"終了");
    // ソフトキー2のラベルに"撮影"を設定
    w_panel.setSoftLabel(w_panel.SOFT_KEY_2,"撮影");
    // 現在の画面に設定
    Display.setCurrent(w_panel);
  }

  // Panelのサブクラスとして"mypanel"を宣言
  class mypanel extends Panel implements SoftKeyListener {
    // 変数の宣言
    private Camera w_camera;
    private ImageLabel w_imagelabel;
    private TextBox w_textbox;

    public mypanel(){
      // カメラオブジェクトの取得
      w_camera = Camera.getCamera(0);
      // イメージオブジェクトをもつイメージラベルを作成
      w_imagelabel = new ImageLabel();
      // パネルに追加
      add(w_imagelabel);
      // テキストボックス(処理結果表示用)
      w_textbox = new TextBox("テキストボックス", 16, 1, TextBox.DISPLAY_ANY);
      // パネルに追加
      add(w_textbox);
      // イベントリスナーのインスタンス登録
      // ソフトキーリスナー

      setSoftKeyListener(this);
    }

    // ソフトキーが離されたときに実行
    public void softKeyReleased(int param){
      // ソフトキー1が離された時に実行
      if(param == this.SOFT_KEY_1){
        // iアプリ終了
        terminate();
      }
      // ソフトキー2が離された時に実行
      if(param == this.SOFT_KEY_2){
        try {
          // カメラ機能の起動
          w_camera.takePicture();
        } catch (Exception ce) {}
        // カメラオブジェクトに保持されている画像を、メディアイメージの形式で取得
        MediaImage w_media = w_camera.getImage(0);
        try {
          w_media.use();
        } catch (Exception ce) {}
        // メディアイメージからイメージオブジェクトを取得
        Image w_image = w_media.getImage();
        // ラベル画像を設定・変更
        w_imagelabel.setImage(w_image);
        // 画像を送信
        w_textbox.setText("画像送信中");
        imageOut();
      }
    }
    // ソフトキーが押されたときに実行
    // ※今回は使用しないが、記述しておかないとコンパイルエラーになる

    public void softKeyPressed(int param){
    }

    // 画像を送信
    public void imageOut() {
      // 変数の宣言
      HttpConnection w_connect;
      InputStream w_in;
      OutputStream wo_stream;
      byte[] w_data;
      int w_length;

      try {
        // 入力ストリームを取得
        w_in=w_camera.getInputStream(0);

        // 出力先への接続を設定
        String w_url = new String(getSourceURL()+"test43.cgi");
        w_connect = (HttpConnection)Connector.open(w_url,Connector.READ_WRITE,true);
        // 要求メソッドとコンテンツタイプを設定
        w_connect.setRequestMethod(HttpConnection.POST);
        w_connect.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        // 出力ストリームを取得
        wo_stream = w_connect.openOutputStream();

        // 入力ストリームから出力ストリームへ、順次、書き込む
        w_data=new byte[128];
        while ((w_length=w_in.read(w_data)) != -1 ) {
          wo_stream.write(w_data,0,w_length);
        }
        // 入力ストリームをクローズ
        w_in.close();
        // 出力ストリームをクローズ
        wo_stream.close();

        // 実際に接続
        w_connect.connect();

        // 入力ストリームを取得
        InputStream wi_stream = w_connect.openInputStream();
        // InputStreamReaderインスタンスを作成
        // ※SJISをUnicodeに変換

        InputStreamReader wi_buffer = new InputStreamReader(wi_stream);
        // StringBufferインスタンスを作成
        StringBuffer w_StringBuffer = new StringBuffer();
        // CGIから送信されたストリームを読取
        String w_remsg;
        int w_char;
        while ((w_char = wi_buffer.read()) != -1) {
          w_StringBuffer.append((char)w_char);
        }
        w_remsg = (String)w_StringBuffer.toString();
        // メッセージ表示領域に、CGIからの返答メッセージを設定
        w_textbox.setText(w_remsg);

        // 入力ストリームをクローズ
        wi_stream.close();
        // 接続をクローズ
        w_connect.close();
      }
      catch (Exception e){w_textbox.setText("画像書込エラー");}
    }
  }
}

<サーバ側CGI>※Perl言語使用

画像出力専用のCGIプログラム
※iアプリから送信された画像を、サーバ上に出力する。
<仕様>
・iアプリから送信された画像を読み込む
・画像を出力(print)する
<関連ファイル等>
test43.jpg :画像出力用ファイル

プロブラムソース "test43.cgi"  
※iアプリからの要求により、サーバ側で動作。Perl言語使用。
#!/usr/bin/perl

# データの受信
binmode(STDIN);
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'} );

# 画像の出力
print "Content-type: image/jpg\n\n";
open(IMG,">test43.jpg");
binmode(IMG);
print IMG $buffer;
close(IMG);

# 書込み完了メッセージ出力
print "画像 書込完了";

17.携帯電話の個体識別情報の取得

DoJa-2.1プロファイルでは、携帯電話の個体識別情報の参照が可能になりました。
※この機能を利用する場合、ADFのGetUtnキーに"terminalid"の指定が必要です。

メソッド名 メソッドの機能
getProperty() 携帯電話の個体識別情報の取得
<プロパティ値>
・TERMINAL_ID:携帯電話本体の識別情報
・USER_ID:ICチップカードの識別情報

<サンプル 23>
 個体識別情報取得
※iアプリを起動すると、携帯電話の個体識別情報が画面に表示されます。

実行結果
※FOMA N2051で確認
 
プロブラムソース "test23.java"  ソースダウンロードサイトへ
// パッケージのインポート
import com.nttdocomo.ui.*;
import com.nttdocomo.util.*;

// IApplicationのサブクラスとして"test23"を宣言
// ※IApplicationは、iアプリ作成時、必須クラスです。
public class test23 extends IApplication {
  // 初期化処理
  // ※iアプリ起動時に、この"start"メソッドが呼ばれる
  public void start() {
    // "mycanvas"オブジェクトを生成
    mycanvas w_canvas = new mycanvas();
    // ソフトキー1のラベルに"終了"を設定
    w_canvas.setSoftLabel(w_canvas.SOFT_KEY_1,"終了");
    // 現在の画面に設定
    Display.setCurrent(w_canvas);
  }

  // Canvasのサブクラスとして"mycanvas"を宣言
  class mycanvas extends Canvas {
    // 描画メソッド
    public void paint(Graphics g) {
      // 携帯電話の個体識別情報の取得
      String w_property;
      w_property = Phone.getProperty(Phone.TERMINAL_ID);
      // 個体識別情報をX軸=10、Y軸=30ドットの位置に描画
      g.drawString(w_property, 10, 30);
    }
    // イベント処理
    // ※低レベルイベントが発生すると、この"processEvent"メソッドが呼ばれる

    public void processEvent(int w_type,int w_param) {
      // ソフトキー1が押された場合に処理
      if ((w_type==Display.KEY_PRESSED_EVENT) && (w_param==Display.KEY_SOFT1)) {
        // アプリケーション終了
        terminate();
      }
    }
  }
}
目次 前頁

All Rights Reserved. (c)Copyright omori 2003