さて超久し振りに技術ネタでも書いてみようと思います。Xperia Z1からカメラアプリにプラグインで外部アプリを追加できるような仕組みが提供されました。この機能は海外版のXperia ZやZ UltraにもAndroid4.3へのバージョンアップと共に提供されてます。今回はこのXperiaのカメラアプリ作成を取り上げたいと思います。
■開発環境のセットアップ
カメラアプリ作成用のSDKがCamera Add-on APIとして提供されてますので、これを使えるように開発環境をセットアップしましょう。
Android SDK Managerを立ち上げて、ToolsメニューからManage Add-on Sites...を選択し、User Defined Sitesに以下のURLを追加します。
http://dl-developer.sonymobile.com/sdk_manager/Sony-Add-on-SDK.xml
そうすると、Android 4.1.2用の追加パッケージとして、Sony Add-on SDKが選択できるようになっているはずなので、インストールします(下図は既にいろいろインストール済の状態ですが、最新のSony Add-on SDK2.1だけをインストールすれば問題ありません)。
Sony Add-on SDKをインストールすると、今回取り上げるカメラアプリ用以外にもスマートウォッチ用やSmall App用のSDKが提供されますので、これらに関してもいずれ取り上げたいと思います。
また、Camera Add-onに対応したアプリの作成に関しては、UIのガイドラインなども規定されており、こちら(リンク)からAdd-onの仕組みも含めかなりしっかりとしたドキュメントがダウンロードできますので、一読しておくことを強くお薦めいたします。英語ですが。。
■サンプルカメラアプリ
AndroidのSDKをインストールしたフォルダーを$ANDROID_SDK_HOMEだとすると、$ANDROID_SDK_HOME/add-ons/以下にadd-onとしてインストールしたパッケージがあり、Sony Add-on SDKもここにあります($ANDROID_SDK_HOME/add-ons/addon-sony_add-on_sdk_2_1-sony-16/)。
このフォルダーの中にCamera Add-onのサンプルアプリがありますので($ANDROID_SDK_HOME/add-ons/addon-sony_add-on_sdk_2_1-sony-16/samples/CameraAddon)、この中のMultiFunctionCameraAppSampleをEclipseにインポートしましょう。
MultiFunctionCameraApp.javaがアプリ本体で、CameraTask.javaはカメラのプレビューを表示するSurfaceViewを管理する為のSurfaceHolderです。
MultiFunctionCameraAppアクティビティーには3つのImageButtonがあり、ひとつはカメラのシャッターボタン(@+id/capture)、もうひとつは最新の写真/動画を表示する為のサムネイルボタン(@+id/thumnail_button)、そしてCamera Add-onアプリを選択する為のメニューを表示する為のモード選択ボタン(@+id/button)です。
このCamera Add-onアプリを選択する為のメニュー(下図)を制御する為のクラスがCapturingModeSelectorです。
これをアプリの中に組み入れればいいわけですね。
初期化のコードはアクティビティのOnResume()メソッド内になります。
try { Class.forName("com.sonymobile.camera.addon.capturingmode.CapturingModeSelector"); // Create a parent view for the capturing mode selector view. ViewGroup modeSelectorContainer = (ViewGroup)findViewById(R.id.modeselector_container); // Create a CapturingModeSelector mCapturingModeSelector = new CapturingModeSelector(this, modeSelectorContainer); // Set two listeners on the CapturingModeSelector mCapturingModeSelector.setOnModeSelectListener(new MyOnModeSelectListener()); mCapturingModeSelector.setOnModeFinishListener(new MyOnModeFinishListener()); } catch (ClassNotFoundException cnfe) { // If the camera add-on library is not found (Camera add-on API not supported), // implement suitable exception handling. Log.e(TAG, "Camera add-on library not found. Handle the exception, eg. finish the activity."); cnfe.printStackTrace(); finish(); } catch(SecurityException se) { // If a SecurityException (Insufficient privileges) is caught, // implement suitable exception handling. Log.e(TAG, "Camera add-on permission not granted. Handle the exception."); se.printStackTrace(); showPopupReinstall(); }Camera Add-onのライブラリーが存在するかどうかを調べ、CapturingModeSelectorをインスタンス化して2つのリスナーを設定しています。また、Camera Add-onをアプリで使用するには、AndroidManifest.xmlファイルに以下のパーミッションを設定する必要があります。
<uses-permission android:name="com.sonymobile.permission.CAMERA_ADDON"/>以下がCapturingModeSelectorクラスのパブリックメソッド一覧ですが、詳細はこちら(リンク)を参照してください。
void | open(モード名) CapturingModeSelectorを表示します |
void | close() CapturingModeSelectorを閉じます |
boolean | isOpened() CapturingModeSelectorを表示していたら真を返す |
void | setOnModeSelectListener(コールバック) CapturingMode選択時のコールバック |
void | setOnModeFinishListener(コールバック) CapturingMode選択時のコールバック |
void | setUiOrientation(int orientation) 画面のオリエンテーションを設定 |
void | release() CapturingModeSelectorを破棄します |
setOnModeSelectListener()とsetOnModeFinishListener()と2つコールバックの設定ができますが、これの使い分けはユーザが選択したモードが選択前と同じパッケージ名・アクティビティの場合にsetOnModeSelectListener()が呼ばれます。
つまり大雑把に言うと、自分のアプリに処理が戻って来る場合はsetOnModeSelectListener()が呼ばれ、違うアプリに遷移する場合には、setOnModeFinishListener()が呼ばれます。以下それぞれのコールバックの処理部です。
setOnModeSelectListener()
public void onModeSelect(String modeName) { mCapturingModeSelector.close(); setViewsVisibility(View.VISIBLE); setThumbnail(); }自分のアプリに戻るので、CapturingModeSelectorを閉じてViewの再設定をしています。
setOnModeFinishListener()
public void onModeFinish() { mCapturingModeSelector.close(); finish(); }他のアプリに遷移するので、CapturingModeSelectorを閉じて、アプリを終了しています。
で、ソースコードを見てみると基本的にCapturingModeSelector周りのコードはあまり弄る必要が無いことがわかります(モードボタン等の選択に応じたメニューの表示/非表示や画面のローテーションに応じた画面オリエンテーションの設定をしているだけ)。なので、Camera Add-onに対応したカメラアプリを作るには、このMultiFunctionCameraAppのソースコードを雛形に使えば良さそうです。
と言うわけで、次回以降このコードをベースにCamera Add-on対応アプリを何か作って行きたいと思います。