Android標準には、カメラクラス(com.android.hardware.Camera)が存在していますが、これはその標準カメラクラスを拡張するためのAPIです。
Android2.3の拡張により、標準Androidでも複数のカメラデバイスを制御可能になりましたが、com.android.hardware.Cameraでは、二眼カメラを使用するためのIFが存在していないため、二眼カメラ使用時に必要となるIFを追加します。
なお、カメラクラスのみではなく、カメラデバイス情報クラス(CameraEx.CameraInfo)、イメージ取得コールバックインターフェース(CameraEx.DoubleCallback)の拡張・追加も行っています。
CameraExクラスは標準のCameraを拡張することで、二眼カメラのオブジェクトを取得可能にしています。
CameraExを使用する場合、com.android.hardware.Cameraオブジェクトが返却されますので、以後は標準のCameraオブジェクトと同じ使い方ができます。
※Android標準のカメラ使用法 参照(2.3以降)
CameraEx.CameraInfoクラスは標準のCamera.CameraInfoを拡張ることで、通常のカメラデバイス情報に加え、レンズの使用モードに関する情報を取得可能にしています。
これにより、起動するカメラが、二眼(左右のレンズを使用)なのか、単眼(左側片方のレンズを使用)なのかを判別・設定可能になっています。
二眼カメラで取得した、左眼イメージ、右眼イメージを取得するためのコールバックインターフェースです。
二眼カメラでキャプチャイメージデータが生成された際に呼び出されます。
左眼イメージと右眼イメージをひとつのMPOファイル(3D表示用の画像形式)として保存する場合は、サンプルアプリに含まれているMpfUtility.javaを参考にしてください。
CameraEx.open()を使用することで、実機に付属しているカメラを起動することができます。
実機に複数のカメラデバイスが付属している場合は、Android標準同様、カメラIDによる制御を行ってください。
起動したカメラの切替は、一旦カメラオブジェクトを解放し、再度CameraEx.open()で起動しなおしてください。
標準のカメラクラス使用方法についてはAndroid Developersのサイトを参照してください。
Android Developers
標準カメラクラス android.hardware.Camera
使用例 API Demos CameraPreview.java
SDKへAddOnの追加と、Manifestファイルへライブラリの参照およびAPIを使用するためのパーミッションを記述する必要があります。
パッケージ名 | クラス名 | 備考 |
---|---|---|
jp.co.sharp.android.hardware | CameraEx | カメラ拡張クラス |
jp.co.sharp.android.hardware | CameraEx.CameraInfo | カメラデバイス情報クラス |
jp.co.sharp.android.hardware | CameraEx.DoublePictureCallback | キャプチャイメージ取得用コールバックインタフェース |
まず、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ファイルの<manifest>要素の子要素に<uses-permission>を追加します。
<uses-permission>のandroid:name属性にandroid.permission.CAMERAを設定します。
これらの宣言がなければ、カメラを使用することができないため、注意してください。
3D表示を行う場合は、上記に加え、3D表示のためのライブラリの参照設定が必要となります。
詳細は3D立体視の公開APIに関するページを参照してください。
基本的なカメラの起動および、カメラが取得した画像を表示するviewの設定についてはDevelopersのサンプルを参照してください。
○カメラデバイスの数を取得する
標準Android同様、カメラIDの利用にはまず実機に付属しているカメラデバイスの数を取得します。
○カメラデバイス情報を取得する
標準Android同様、カメラデバイス情報をそれぞれのIDごとに取得します。
カメラデバイスの個数-1がカメラIDの最大値となります。(0~最大値)
デバイス情報は1件ずつ取得するため、複数あるカメラ分取得したい場合はそれぞれのIDごとに取得してください。
○カメラデバイス情報からカメラの種類を判別する
CameraInfoの値のうち、カメラの種類の判別に必要なのは facing 、 mode です。
★現在発売中の二眼カメラ搭載機種でのパラメータは以下★
メインカメラ | 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表示にする場合は、SurfaceViewに対して3D表示の設定を行う必要があります。
3D表示の設定に関する詳細は、3D立体視の公開API情報を参照してください。
※サンプルアプリではSurfaceControllerクラスを用いています。
サンプルアプリはデバイスに付属しているカメラを一覧で表示し、その中にあるカメラのみ指定して起動可能です。
非搭載のカメラは、カメラの一覧リストに表示されません。
撮影したデータの保存方法などはDevelopersの標準カメラクラスの説明を参照してください。
Android Developers
標準カメラクラス android.hardware.Camera
撮影データを取得するIF
二眼カメラ起動中に、takePicture()を使う場合、左右それぞれのレンズから撮影データを取得するIFが追加されています。
この2種類のtakePictureの使い方は、基本的に標準のtakePicture()と同等のため必要なコールバックインタフェースと組み合わせる必要があります。
こちらはコールバックインターフェースにすべて標準のクラスを用いており、撮影時に呼ばれるonPictureTaken()メソッドも標準のものです。
Camera.PictureCallback を implementsして利用してください。
二眼カメラを用いた場合のみ、onPicutureTaken()が2回呼ばれます。
最初に来るのは左眼用、次が右眼用です。
こちらはイメージデータのコールバックインターフェースが、拡張されたCameraEx.DoublePictureCallbackです。
CameraEx.DoublePictureCallback をimplements してご利用ください。
撮影時に拡張されたonPicureTaken()が呼ばれ、その引数には左眼用、右眼用の画像データが含まれています。
二眼カメラで撮影した場合は、左眼用、右眼用どちらにもデータがある状態となり、単眼で撮影した場合は左眼用の引数にデータが入った状態で呼び出されます。
二眼カメラで撮影した左右それぞれの画像を3D表示用の画像(MPO)として保存する場合は、サンプルアプリに含まれている
MpfUtility.javaを参考にしてください。
Android2.2用まではカメラポジションによるメインカメラ/サブカメラの制御を可能としていましたが、標準Android2.3では標準で複数カメラの制御が可能となったため、標準の仕様に基づいた制御に変更し、従来のカメラポジションの値は廃止いたしました。
Android2.2用までのCameraExを用いて作成したアプリをAndroid2.3用のCameraEx搭載機種へインストールした場合も動作いたしますが、本来のカメラIDを用いた制御とは異なる動作となっているため
(たまたまカメラポジションの値がIDと一致した場合正常な起動)そのまま流用されるのはオススメできません。