連載
» 2010年05月27日 00時00分 公開

Androidで動く携帯Javaアプリ作成入門(17):もはやケータイに必須のカメラをAndroidで制御しよう (3/3)

[ 緒方聡,株式会社イーフロー]
前のページへ 1|2|3       

フラッシュやフォーカス、色合いも変えれるカメラAPI

 Camera.Parametersというクラスを使用してカメラの設定ができます。

設定項目 説明
Antibanding 階調の落差に関する設定
ColorEffect 色合いを変更
FlashMode フラッシュの設定
FocusMode フォーカスの動作に関する設定
SceneMode 撮影シーンの設定
WhiteBalance ホワイトバランスの設定
表 カメラの設定(抜粋)

 上記以外にも写真に位置情報を入れたり、写真のサイズを変更したり、JPEGのクオリティを設定したりできます。

 気を付けなければならないのは、「Camera.Parametersで定義されている設定は、必ずしもすべての端末で使用できるわけではない」という点です。

 例えば「花火を撮影するシーン」というものがCamera.Parameters.SCENE_MODE_FIREWORKSとして定義されていますが、これが使用できるかできないかは、以下のように判定する必要があります。

Camera.Parameters params = camera.getParameters();
List<String> supported = params.getSupportedSceneModes();
if (supported != null) {
    for (String sm : supported) {
        if (sm.equals(Camera.Parameters.SCENE_MODE_FIREWORKS)) {
            // サポートしている
        }
    }
}

 以下は、ColorEffectを設定した比較です。

図3 左からColorEffectが 図3 左からColorEffectが"none"、"mono"、"sepia"の比較

 端末でサポートされているならば、設定するだけで効果が現れるので、とても簡単です。設定画面はプレビューの右上辺りをタッチしてください。

コラム 「カメラ制御の勘所」

カメラを制御するためにCamera.openメソッドでインスタンスを取得しますが、内部ではカメラのサービスに接続を行っています。ほかのアプリがカメラを使っている場合、接続に失敗することがあるのはもちろん、自分のアプリも使い終わったら適切に解放する必要があります

Camera.open()メソッドはRuntimeExceptionが発生する可能性があり、カメラを使い終える場合はCamera#release()メソッドは忘れてはいけません。

カメラの設定を行う際にも、カメラのインスタンスが必要ですが、設定画面は今回のようにカメラのプレビューを表示させているActivityとは異なる場合があると思います。

この場合、設定画面を呼び出した際に、プレビューのSurfaceViewはsurfaceDestroyedが呼び出されライフサイクルを終了しますが、カメラはCamera#release()を呼び出さずに生かしたままにしておきます。設定画面では、設定した内容を呼び出し元のActivityにIntentとして返し、呼び出し元は戻ってきた際に再びSurfaceViewを生成してカメラにプレビューやコールバックを設定し直し、設定されたパラメータを適用する、という方法を採ると、比較的シンプルになります。

カメラのライフサイクルは、SurfaceViewのライフサイクルと密接な関係を持ちますが、同時にActivityのライフサイクルとも密接な関係を持ちます。今回のサンプルアプリでは、簡単であるため実装していませんが、実際にはActivity#onPause()などで、プレビューを停止し、カメラをリリースする必要があります。


オーバーレイでAR(拡張現実)アプリもできる?

 カメラのプレビューにオーバーレイを重ねて表示させることで、実際に見えている映像に情報を付加することが可能です。

図4 プレビューにオーバーレイを重ねる 図4 プレビューにオーバーレイを重ねる

 サンプルのオーバーレイ機能は、タッチされた場所にロボットを描画するだけの機能ですが、サンプルとしては分かりやすいと思いますので、ソースコードを参照してみてください。

 オーバーレイは、いま流行の拡張現実(Augmented Reality、AR)の入り口でもあります。ARは難しいものではありません。撮影した写真の右下に撮影日を表示するのも、立派なARの1つです。Androidでは、位置情報が取得できるので、そういったものをプレビューにオーバーレイすることも比較的簡単です。

 現実世界側の映像情報を解析して拡張する、あるいはクラウド上に蓄積されたデータを位置情報から取得して拡張するなどの方法は、日付けや位置情報をただ表示するのに比べ高度な技術が必要ですが、その分面白い効果が得られます。

Androidアプリはカメラも面白い!

 Androidのカメラ制御は、iアプリS!アプリなどに比べ、使い勝手が格段に良いです。それもそのはず、Androidに標準搭載されているカメラアプリも、今回紹介したAPIと同じものを使用して作られているので、標準アプリと同じレベルのものは作れてしまうわけです。がんばれば、標準カメラアプリを置き換えられるアプリだって作れます。

 カメラは写真の撮影だけではなく、プレビューですら用途にあふれています。特にARについては、これから広がっていく分野なので注目に値します。

 YouTubeで「Android AR」で検索すると、たくさんの面白いアイデアのデモが見つけられます。興味があれば見てみてください。


「Androidで動く携帯Javaアプリ作成入門」バックナンバー
前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。