カメラAPI概要

【APIの説明】

カメラAPIについて

Android標準には、カメラクラス(com.android.hardware.Camera)が存在していますが、これはその標準カメラクラスを拡張するためのAPIです。
Android2.3の拡張により、標準Androidでも複数のカメラデバイスを制御可能になりましたが、com.android.hardware.Cameraでは、二眼カメラを使用するためのIFが存在していないため、二眼カメラ使用時に必要となるIFを追加します。
なお、カメラクラスのみではなく、カメラデバイス情報クラス(CameraEx.CameraInfo)、イメージ取得コールバックインターフェース(CameraEx.DoubleCallback)の拡張・追加も行っています。

CameraExクラスについて

CameraExクラスは標準のCameraを拡張することで、二眼カメラのオブジェクトを取得可能にしています。
CameraExを使用する場合、com.android.hardware.Cameraオブジェクトが返却されますので、以後は標準のCameraオブジェクトと同じ使い方ができます。
※Android標準のカメラ使用法 参照(2.3以降)

CameraEx.CameraInfoクラスについて

CameraEx.CameraInfoクラスは標準のCamera.CameraInfoを拡張ることで、通常のカメラデバイス情報に加え、レンズの使用モードに関する情報を取得可能にしています。
これにより、起動するカメラが、二眼(左右のレンズを使用)なのか、単眼(左側片方のレンズを使用)なのかを判別・設定可能になっています。

CameraEx.DoublePictureCallbackインターフェースについて

二眼カメラで取得した、左眼イメージ、右眼イメージを取得するためのコールバックインターフェースです。
二眼カメラでキャプチャイメージデータが生成された際に呼び出されます。
左眼イメージと右眼イメージをひとつのMPOファイル(3D表示用の画像形式)として保存する場合は、サンプルアプリに含まれているMpfUtility.javaを参考にしてください。

複数のカメラの起動、切替について

CameraEx.open()を使用することで、実機に付属しているカメラを起動することができます。 
実機に複数のカメラデバイスが付属している場合は、Android標準同様、カメラIDによる制御を行ってください。
起動したカメラの切替は、一旦カメラオブジェクトを解放し、再度CameraEx.open()で起動しなおしてください。

Android標準のカメラ使用法

標準のカメラクラス使用方法についてはAndroid Developersのサイトを参照してください。

Android Developers
標準カメラクラス android.hardware.Camera
使用例 API Demos CameraPreview.java

このAPIを使用するには

SDKへAddOnの追加と、Manifestファイルへライブラリの参照およびAPIを使用するためのパーミッションを記述する必要があります。

【パッケージ/クラス一覧】

パッケージ名 クラス名 備考
jp.co.sharp.android.hardware CameraEx カメラ拡張クラス
jp.co.sharp.android.hardware CameraEx.CameraInfo カメラデバイス情報クラス
jp.co.sharp.android.hardware CameraEx.DoublePictureCallback キャプチャイメージ取得用コールバックインタフェース

【APIの使い方】

Manifestファイルの記述

まず、Manifestファイルへ、アプリケーションが参照するライブラリの参照設定を行います。
Manifestファイルの<application>要素の子要素に<uses-library>を追加します。
<uses-library>の android:name属性にjp.co.sharp.android.hardware を設定します。
<uses-feature>は<manifest>の子要素に追加します。
<uses-feature>の android:name属性にjp.co.sharp.android.hardware.cameraex を設定します。
<uses-feature>の android:required属性にtrue を設定します。
また、二眼カメラが必須の場合は<uses-feature>でさらにjp.co.sharp.android.hardware.cameratwinを設定してください。
<uses-feature>を設定することにより、弊社端末の二眼カメラ搭載機種以外でGoogle Playにアクセスした場合に表示されないようになります。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.example.package.name">
  ...
  <application android:name="MyApplication" >
    <uses-library android:name="jp.co.sharp.android.hardware" />
    ...
  </application>
  <uses-feature
              android:name="jp.co.sharp.android.hardware.cameraex"
              android:required="true" />

  <uses-feature
              android:name="jp.co.sharp.android.hardware.cameratwin"
              android:required="true" /> <!-- ★二眼カメラ必須の場合★ -->

 
  ...
</manifest>

次に、アプリケーションで、カメラデバイスを使用するための、パーミッション設定をします。
Manifestファイルの<manifest>要素の子要素に<uses-permission>を追加します。
<uses-permission>のandroid:name属性にandroid.permission.CAMERAを設定します。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.example.package.name">
  ...
  <application android:name="MyApplication" >
    ...
  </application>
  ...
  <uses-permission android:name="android.permission.CAMERA" />
  ...
</manifest>

これらの宣言がなければ、カメラを使用することができないため、注意してください。

3D表示を行う場合は、上記に加え、3D表示のためのライブラリの参照設定が必要となります。
詳細は3D立体視の公開APIに関するページを参照してください。

カメラの起動・表示

基本的なカメラの起動および、カメラが取得した画像を表示するviewの設定についてはDevelopersのサンプルを参照してください。

Android Developers
使用例 API Demos CameraPreview.java

二眼カメラの判別方法

○カメラデバイスの数を取得する
標準Android同様、カメラIDの利用にはまず実機に付属しているカメラデバイスの数を取得します。

/* 利用可能なカメラデバイスの数を取得 */
int cameras = CameraEx.getNumberOfCameras();

○カメラデバイス情報を取得する
標準Android同様、カメラデバイス情報をそれぞれのIDごとに取得します。
カメラデバイスの個数-1がカメラIDの最大値となります。(0~最大値)
デバイス情報は1件ずつ取得するため、複数あるカメラ分取得したい場合はそれぞれのIDごとに取得してください。

/* 利用可能なカメラデバイスの数を取得 */
CameraEx.CameraInfo info;
CameraEx.getCameraInfo(カメラID, info); //カメラIDはint型です

○カメラデバイス情報からカメラの種類を判別する
CameraInfoの値のうち、カメラの種類の判別に必要なのは facing 、 mode です。

CameraEx.getCameraInfo(カメラID, info);
 
/* カメラデバイスの種類を判別する */
if (info.facing == CameraEx.CameraInfo.CAMERA_FACING_BACK) {
    // カメラはスクリーンの反対側に付いている
    if (info.mode == CameraEx.CameraInfo.CAMERA_MODE_SINGLE) {
        // 単眼モード
    } else if (info.mode == CameraEx.CameraInfo.CAMERA_MODE_DOUBLE) {
        // 二眼モード
    }
} else if (info.facing == CameraEx.CameraInfo.CAMERA_FACING_FRONT) {
    // カメラはスクリーン側に付いている
    if (info.mode == CameraEx.CameraInfo.CAMERA_MODE_SINGLE) {
        // 単眼モード
    } else if (info.mode == CameraEx.CameraInfo.CAMERA_MODE_DOUBLE) {
        // 二眼モード
    }
    
}

★現在発売中の二眼カメラ搭載機種でのパラメータは以下★


メインカメラ   facing   CAMERA_FACING_BACK
(アウトカメラ)   mode   CAMERA_MODE_SINGLE
         
サブカメラ   facing   CAMERA_FACING_FRONT
(インカメラ)   mode   CAMERA_MODE_SINGLE
         
3Dカメラ   facing   CAMERA_FACING_BACK
(二眼カメラ)   mode   CAMERA_MODE_DOUBLE

カメラの起動

カメラの起動(CameraEx.open)は、Android標準と同じ方法です。
カメラがひとつしか付いていない場合はCameraEx.open()、複数ある場合はCameraEx.open(ID)を使います。

※注意事項
二眼カメラの起動には必ずCameraEx.openを用いてください。
また、CameraInfoもCameraEx.CameraInfoをご使用ください。
Camera.openおよび、Camera.CameraInfoでは、メインカメラとサブカメラの起動・情報の取得は可能ですが、二眼カメラの起動および、情報の取得は不可能です。

 一部機種では、3D表示とカメラの同時使用ができない制限があります。
制限のある機種では、3D表示中にカメラをopen()すると例外(RuntimeException)が発生します。


3D表示とサブカメラの同時使用ができない機種:
 003SH / 006SH / SH-12C / IS12SH 3D

表示とメインカメラの同時使用ができない機種:
 005SH / 009SH / IS11SH

二眼カメラ起動時の3D表示について

二眼カメラを起動した際、カメラのプレビューを3D表示にする場合は、SurfaceViewに対して3D表示の設定を行う必要があります。
3D表示の設定に関する詳細は、3D立体視の公開API情報を参照してください。
※サンプルアプリではSurfaceControllerクラスを用いています。

【その他の特記事項】

サンプルアプリについて

サンプルアプリはデバイスに付属しているカメラを一覧で表示し、その中にあるカメラのみ指定して起動可能です。
非搭載のカメラは、カメラの一覧リストに表示されません。
撮影したデータの保存方法などはDevelopersの標準カメラクラスの説明を参照してください。

Android Developers
標準カメラクラス android.hardware.Camera
撮影データを取得するIF

public final void takePicture (
    Camera.ShutterCallback shutter,
    Camera.PictureCallback raw,
    Camera.PictureCallback postview,
    Camera.PictureCallback jpeg
)
 public final void takePicture (
    Camera.ShutterCallback shutter,
    Camera.PictureCallback raw,
    Camera.PictureCallback jpeg
)

二眼カメラで取得した3D立体画像の保存について

二眼カメラ起動中に、takePicture()を使う場合、左右それぞれのレンズから撮影データを取得するIFが追加されています。
この2種類のtakePictureの使い方は、基本的に標準のtakePicture()と同等のため必要なコールバックインタフェースと組み合わせる必要があります。

public final void takePicture (
    Camera.ShutterCallback shutter,
        // イメージキャプチャ完了時コールバック。(null指定可)
    Camera.PictureCallback left_raw,
        // 非圧縮/左眼イメージデータコールバック。(null指定可)
    Camera.PictureCallback right_raw,
        // 非圧縮/右眼イメージデータコールバック。(null指定可)
    Camera.PictureCallback postview,
        // ポストビューイメージデータコールバック。(null指定可)
    Camera.PictureCallback left_jpeg,
        // 圧縮/左眼イメージデータコールバック。(null指定可)
    Camera.PictureCallback right_jpeg
        // 圧縮/右眼イメージデータコールバック。(null指定可)
)

こちらはコールバックインターフェースにすべて標準のクラスを用いており、撮影時に呼ばれるonPictureTaken()メソッドも標準のものです。
Camera.PictureCallback を implementsして利用してください。
二眼カメラを用いた場合のみ、onPicutureTaken()が2回呼ばれます。
最初に来るのは左眼用、次が右眼用です。

public final void takePicture (
    Camera.ShutterCallback shutter,
        // イメージキャプチャ完了時コールバック。(null指定可)
    CameraEx.DoublePictureCallback raw,
        // 非圧縮イメージデータコールバック。(null指定可)
    Camera.PictureCallback postview,
        // ポストビューイメージデータコールバック。(null指定可)
    CameraEx.DoublePictureCallback jpeg
        // 圧縮イメージデータコールバック。(null指定可)
)

こちらはイメージデータのコールバックインターフェースが、拡張されたCameraEx.DoublePictureCallbackです。
CameraEx.DoublePictureCallback をimplements してご利用ください。
撮影時に拡張されたonPicureTaken()が呼ばれ、その引数には左眼用、右眼用の画像データが含まれています。
二眼カメラで撮影した場合は、左眼用、右眼用どちらにもデータがある状態となり、単眼で撮影した場合は左眼用の引数にデータが入った状態で呼び出されます。

二眼カメラで撮影した左右それぞれの画像を3D表示用の画像(MPO)として保存する場合は、サンプルアプリに含まれている
MpfUtility.javaを参考にしてください。

Android2.2用AddOnでのCameraExとの差異について

Android2.2用まではカメラポジションによるメインカメラ/サブカメラの制御を可能としていましたが、標準Android2.3では標準で複数カメラの制御が可能となったため、標準の仕様に基づいた制御に変更し、従来のカメラポジションの値は廃止いたしました。
Android2.2用までのCameraExを用いて作成したアプリをAndroid2.3用のCameraEx搭載機種へインストールした場合も動作いたしますが、本来のカメラIDを用いた制御とは異なる動作となっているため (たまたまカメラポジションの値がIDと一致した場合正常な起動)そのまま流用されるのはオススメできません。

  • ※ 2011年7月4日 【APIの使い方】カメラの起動―※注意事項を追記致しました。
このページの先頭へ