読者です 読者をやめる 読者になる 読者になる

Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Android端末についている複数のカメラを使い分けるには?

Android

こんばんは。kimukimuです。

Android2.3の新機能シリーズ、まだまだ続きますよ。

と、ただここで最近のAndroid動向を。

1. 最近のAndroidニュース

まずはAndroid4.0"ICE Cream Sandwich"の情報が徐々に出てきていますね。

Android4.0はAndroid2系の携帯Androidと、
Android3系のタブレットAndroidの機能を統合してさらに進化させたものです。
今からとても楽しみですね!

後は、Android・・・というか、スマートフォン使いにとっては残念な話ですが、
携帯電話の帯域制限についても明らかになってきています。
使いすぎるのもほどほどに。。。ということでしょうか。

2.Android端末に2つカメラが付いている!?

では、本題に。
今回試してみるのは、「マルチカメラ機能」です。
現在タブレット系のAndroid端末にはバックカメラとフロントカメラ。。。
といった感じに複数カメラが搭載されています。

そんな中で書くのは微妙ですが、実はAndroid2.2までだとOSが提供しているAPIだと
カメラって一つしか扱えなかったりしました。

Garaxy Tabみたいに複数カメラを搭載した端末はあったんですが、
複数のカメラを開発したアプリ側から自由に使うことはできなかったわけですね。
2つ目以降のカメラは初めからインストールされたアプリケーション専用のカメラでした。

ですが、Android2.3以降はOSとしてもマルチカメラをサポートし、
2つ目以降のカメラの情報を取得したり、画像を利用することができるようになりました!
早速、試してみましょう。

3.アプリケーションマニフェストの記述

今回のアプリケーションマニフェストは下記です。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="jp.gr.t3.multicamera" android:versionCode="1"
  android:versionName="1.0">
  <uses-sdk android:minSdkVersion="9" />

  <uses-feature android:name="android.hardware.camera"
    android:required="true" />
  <uses-permission android:name="android.permission.CAMERA" />

  <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".MultiCameraTestActivity"
      android:label="@string/app_name" android:screenOrientation="landscape"
      android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|fontScale">
      <!-- ★Androidで特定の設定が変更された場合にアクティビティが再生成されるのを防止★ -->
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>

今回はactivityタグにandroid:configChangesという要素を追加しています。(★)
この要素は何かというと、
「特定の設定が変更された場合にActivityが再生成されて
 入力項目がリセットされるのを防止するためのもの」です。

例えば、特に何も設定をしていない場合、端末の向きを変更すると
Activityが再生成され、それまで入力した値がリセットされてしまいます。

ですが、android:configChangesにorientationを指定しておけば、
代わりに「Activity#onConfigurationChanged」メソッドが呼ばれ、
Activityが再生成されることを防止することができます。

地味ですが、
「画面の向きを変えたら値が消えちゃった!」
という情けない事態を避けるためには重要です。

4.どんなコードで実現できるのか?

毎度のようにAndroidプロジェクトを作ってカメラ情報取得の処理を記述してみました。

今回もソースコードの解説は「カメラ情報取得」と、「カメラデバイス取得」に絞ります。
MultiCameraTest.zip 直

■カメラ情報取得

// 端末に搭載されているカメラの数を取得 
int numberOfCameras = Camera.getNumberOfCameras();

// 各カメラの情報を取得
for (int i = 0; i < numberOfCameras; i++) {
  CameraInfo caminfo = new CameraInfo();
  Camera.getCameraInfo(i, caminfo);

  // カメラの向きを取得
  int facing = caminfo.facing;

  if (facing == CameraInfo.CAMERA_FACING_BACK) {
    // 後部についているカメラの場合
    Log.d("MultiCameraTest", "cameraId=" + Integer.toString(i)
        + ", this is a back-facing camera");
  } else if (facing == CameraInfo.CAMERA_FACING_FRONT) {
    // フロントカメラの場合
    Log.d("MultiCameraTest", "cameraId=" + Integer.toString(i)
        + ", this is a front-facing camera");
  } else {
    Log.d("MultiCameraTest", "cameraId=" + Integer.toString(i)
        + ", unknown camera?");
  }

  // カメラのOrientation(角度) を取得
  int orient = caminfo.orientation;
  Log.d("MultiCameraTest", "cameraId=" + Integer.toString(i)
      + ", orientation=" + Integer.toString(orient));
}

Camera.getNumberOfCameras()でカメラの数を取得した後、
下記のコードでカメラの情報が取得できます。
CameraInfo caminfo = new CameraInfo();
Camera.getCameraInfo(i, caminfo);

カメラの付いている個所なども取得可能です。


■カメラデバイス取得

// バックカメラ(ICONIA TABの場合)を取得
camera = Camera.open(0);
// フロントカメラ(ICONIA TABの場合)を取得
camera = Camera.open(1);

idを指定することで、複数のカメラの取得を切り替えることが可能です。
なお、Android2.2まではCamera.open()に引数を指定することができず、
複数カメラを搭載していても常に同じカメラしか取得できませんでした。

5. 早速動かしてみます

では、早速Androidタブレットにインストールして動かしてみます。
■Camera0(バックカメラ)

■Camera1(フロントカメラ)

ああっ、石を投げないで~(>_<。)
すみません、今部屋の照明がお亡くなりになっているので、
残念ながら部屋の中がまともに写せないんです。。。

詳細はまた電気が復旧した時にでも。

尚、ICONIA TABでカメラ情報を取得した結果は下記のようになりました。

number of camera = 2
cameraId=0, this is a back-facing camera
cameraId=0, orientation=0
cameraId=1, this is a front-facing camera
cameraId=1, orientation=0

カメラは2個、
1個目が背面正面を向いたカメラで、
2個目が前面正面を向いたカメラ、というわけですね。

6.何が嬉しいの?

前後のカメラに写したものがリアルタイムに見れる。。。
というのがまずは今回試した部分です。

顔と、あと何かを同時に写してテレビ電話をするなど、
いくつか夢は広まりますね。
ただ、惜しむらくは複数カメラを搭載しているAndroid機器が現状タブレットくらい、
といったことでしょうか。

携帯電話で前後の映像を同時に送れる。。。とはならないようです。
今後に期待ですね。