Androidは2.3以降のバージョンでOSレベルで複数のカメラをサポートしています。

SATCHの場合カメラセレクションのサンプル(testCameraRuntimeSelector)があるのですが、なぜかうまく動きません(私だけ...かな)。

ただ、バック・フロントそれぞれのカメラを使う場合のサンプル(testCameraFront、testCameraBack)は動くので、この2つを切り替えながらやってみることにします。

それぞれのシナリオを切り替えて使うってことです。

バック・フロントではそれぞれカメラのキャリブレーションの仕方が違います

まず、フロント・バック共用のアプリケーションIDを決めておきます。上位アプリで使うものです。

com.kddi.satch.xxxx...みたいな感じ。

サンプル(testCameraFront、testCameraBack)にはLuaがありませんので適当に作っておきます。

ただし、フロント・バックで違う動きをさせる場合、同じ名称だと困る場合もあるので、違った名前にしておきます。

xxxxFront.lua、xxxxBack.lua...みたいな感じ。

で、それぞれのLuaを使ってシナリオを作成します。

SATCH Developer siteで署名ファイルを作る場合は、フロント・バックで別々のものを作っておきます。

で最後にasseteにセットするシナリオフォルダーに両方のシナリオを混在させます。

別々にしてもいいのですが、使うリソースが重なっていたりするとメモリの無駄遣いになりますし、要はxmlやlua、dpd、dfkのファイル名が違っていればいいというわけです。






上位アプリを作る

Eclipseで上位アプリを作ります。

SATCHのプロジェクトのサンプルをみると、フロントとバックではずいぶん異なっています。

サンプルのつくりを追ってみると、ベースはフロント用のコードを使いフロントカメラが無い場合バックを用のコードを使ったほうが手っ取り早いと思われます。

プロジェクトのサンプルの中で必要なファイルは以下のとおり。

project/src/com/kddi/satch/sampletests/testCameraFront.java

これは、プロジェクトのMainActivityのサンプルです。

以下の3つは抽象クラスになっています。

project/src/com/kddi/satch/sampleactivity/SatchActivity_usingFrontCamera.java
project/src/com/kddi/satch/sampleactivity/SatchActivity__base_withExitDialog.java
project/src/com/kddi/satch/sampleactivity/SatchActivity__base.java

-----------------------------------------

Eclipseでプロジェクトを新規に作成します。

作成後、パッケージを追加します。パッケージ名は上で決めておいた、com.kddi.satch.xxxxです。

この新パッケージに上の3つに相当する抽象クラスを作成。

assets内にScenarioというフォルダーをつくり、その中にScenario_aというフォルダーを作成(aというのはAndroidを指すようです)。

このScenario_aにフロントとバックのシナリオを入れておきます。

MainActivityのコードは、testCameraFrontのコードとほぼ同じすが、SCENARIO_NAMEはこんな感じになります。

private static final String SCENARIO_NAME = "/assets/Scenario/Scenario_a/**********.dpd";

**********.dpdは、フロントシナリオのdpd名です。

SatchActivity__base_withExitDialogは変わりませんが、SatchActivity_usingFrontCameraとSatchActivity__baseは変更点があります。

SatchActivity__base

ここでは、シナリオをロードする際、どちらのシナリオを使うのか判断するコードを追加しておきます。

以下のような変数を追加。

public String camera_type = "";

どちらのカメラを選んだかをセットする変数。デフォルトはフロントカメラなので、あれば"front"、無ければ"back"になります。

また、カメラを切り替える場合もこの変数にセットした後、シナリオをロードします。

loadScenario()関数で修正・追加。

以下を削除。

String dpdfile = appInfo.sourceDir + getSampleScenarioName();

代わりに以下を追加。

String dpdfile = "";
        if (camera_type.equals("front")){
            dpdfile = appInfo.sourceDir + "/assets/Scenario/Scenario_a/AAAAAAA.dpd";
        }else if (camera_type.equals("back")){
            dpdfile = appInfo.sourceDir + "/assets/Scenario/Scenario_a/BBBBBBB.dpd";
        }


AAAAAAAはフロントカメラ用シナリオ名。

BBBBBBBはバックカメラ用シナリオ名。

SatchActivity_usingFrontCamera

オリジナルではフロントカメラが無い場合はアプリを終了させていますが、今回はフロントカメラが無い場合はバックカメラを使うようにします。

initComponent()関数の最初のほうに以下を追加。

camera_type = "front";

デフォルトはフロントカメラの使用にしておきます。

if文ではフロントカメラを探すようなコードになっています。

で、最後のelseの内容を変えます。

オリジナルではフロントカメラが無い場合、_isInitializedCorrectly = falseになっていますが、バックカメラを使うように変更します。

こんな感じ。

_frameLayout = new FrameLayout(this);
_rendererType = getIntent().getIntExtra(INTENT_KEY_RENDERER_TYPE, ARViewer.RENDERER_GLES10);
_kddiComponent.setRendererType(_rendererType);
_kddiComponent.initialize(_frameLayout);


_isInitializedCorrectly = true;


以上です。




サンプル

動作確認実機:dtab01(docomo)、target Android 4.1.2

サンプルでは顔認識のシナリオを使っています。

フロントカメラの場合、あなたの顔を認識した場合、正面向きのミクさんが現れます。
で、一発パンチが入ります(^^)。

バックカメラの場合はカメラのむこうの顔を認識した場合、後ろ向きのミクさんが現れます。
同じく、一発パンチが入ります(^^)。

起動時はこんな感じ。



私の顔の代わりのケースケくんに登場してもらいます。





カメラをバックに切り替えます(サンプルでは少し時間がかかります)。





やっとさんです。







インストール

Target:Android 2.3.3 or later

動作確認実機:dtab01 (docomo) Android 4.1.2



アプリをQRコードからインストールする方法はコチラを参照


Androidでapkをダウンロードしてもうまくインストールできない場合。

一部の機種限定かもしれませんが、QRコードを使ってダウンロードすると、apkファイルが勝手にzipファイルに変わってインストールできない場合があります。

apkの構造は基本的にはzipと同じなのでこうなってしまうのかもしれません。



apkはDownloadフォルダーにあるので、ファイルマネージャーで拡張子をzip->apkに変更します。

ファイル名を長押しするとメニュが出るので、「名前の変更」を選びます。



で、変更後ファイルをタップすると「インストールはブロックされました」というアラートが出ます。

GooglePlay以外のインストールはセキュリティの関係で基本ブロックされていますが、「今回のみ許可」とか「常に許可」の選択ができますのでどちらか選びます。

インストールの画面がでますので、そのまま続行してください。