2014/02/16

Xperiaカメラアプリ作成 その1

前回のエントリーで昨年は家電をたくさん買い換えたみたいな話をしましたが、最近ほぼ同時にテレビとHDDレコーダも壊れてしまい、引き続き今年も家電を買う流れは止まらないみたいです(笑。それにしても最近の家電はスゴイなぁと約10年振りにテレビを買い換えて改めて思いました。

さて超久し振りに技術ネタでも書いてみようと思います。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クラスのパブリックメソッド一覧ですが、詳細はこちら(リンク)を参照してください。
voidopen(モード名)
CapturingModeSelectorを表示します
voidclose()
CapturingModeSelectorを閉じます
booleanisOpened()
CapturingModeSelectorを表示していたら真を返す
voidsetOnModeSelectListener(コールバック)
CapturingMode選択時のコールバック
voidsetOnModeFinishListener(コールバック)
CapturingMode選択時のコールバック
voidsetUiOrientation(int orientation)
画面のオリエンテーションを設定
voidrelease()
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対応アプリを何か作って行きたいと思います。

0 件のコメント:

コメントを投稿