このマスターシリーズでは、Adobe AIR 2.6で導入されたデスクトップおよびモバイルプラットフォームの新機能について解説します。

本記事では、Adobe AIR 2.5以降で導入されたモバイルアプリケーション向けAPIの使用方法について解説します。

新機能について

今回は、モバイルアプリケーション向けAPIについて取り上げます。

  • マイク入力にアクセスできるMicrophone API
  • OS標準のカメラによる静止画/動画撮影とその取得をするCameraUI
  • デバイス内の画像を選択取得するカメラロール機能

いずれもAndroidではAdobe AIR 2.5から使用できます。iOSではAdobe AIR 2.6から使用可能になりました。

Microphone API

デバイスに付属したマイクを使って音声入力(録音)を利用することができ、Flash Playerおよびデスクトップ版Adobe AIRアプリケーションと同じようにコーディングできます。

Androidにおけるデバイス使用許可の設定

Androidでは各デバイスAPIを使用する場合、アプリケーションごとに使用する旨をアプリケーション記述子ファイルに明記する必要があります。下記のように、android要素のmanifestAddtions要素のmanifest要素内に、user-permission要素としてandroid:name属性に「android.permission_RECORDE_AUDIO」を設定します。

<android> <manifestAdditions><![CDATA[ <manifest android:installLocation="auto"> (…省略…) <uses-permission android:name="android.permission.RECORD_AUDIO"/> </manifest> ]]></manifestAdditions> </android>

なお、iOSではこのような設定は必要ありません。

Microphoneの使用可能の確認と取得

アプリケーションを実行するデバイスにおいてMicrophoneが使用可能かどうかは、MicrophoneクラスのisSupportedプロパティの真偽値で判断します。使用可能であれば、getMicrophoneメソッドを使い、マイク入力をコントロールできるMicrophoneクラスのインスタンスを取得することができます。

if (Microphone.isSupported) { var mic:Microphone = Microphone.getMicrophone(); (…音声入力の処理…) }

マイク入力データの利用

サンプル03_Microphoneでは、アプリケーションを起動するとMicrophoneインスタンスのSAMPLE_DATAイベント発生ごとに、サンプリングデータを延々と画面上に描画します。周囲の音によって波形が変わることがわかると思います。

※具体的なマイク入力データの利用方法は「AIR 2.0 Microphone API 」をご覧ください。

カメラによる静止画と動画の撮影

Adobe AIR 2.5から提供されたCameraUIを使うと、AndroidとiOSそれぞれ標準のカメラ機能をアプリケーション内で利用でき、ユーザが撮影した写真や動画のデータを取得することができます。OS標準のカメラ機能を呼び出すので、いったん画面が切り替わります。撮影が終わるとイベントが発生するので、そこでデータを取得して処理します。取得したカメラの画像をリアルタイムに処理して表示するときは、従来からのCameraクラスを利用します。

なお、サンプル03_Cameraでは、カメラや後で紹介するカメラロールを使った機能を含めたアプリケーションとなっています。まずは、CameraUIの使い方から解説します。

Androidにおけるデバイス使用許可の設定

マイクと同様にAndroidではカメラを使用する場合も、アプリケーションごとに使用する旨をアプリケーション記述子ファイルに明記する必要があります。下記のように、android要素のmanifestAddtions要素のmanifest要素内に、user-permission要素としてandroid:name属性に「android.permission.CAMERA」を設定します。

<android> <manifestAdditions><![CDATA[ <manifest android:installLocation="auto"> …省略… <uses-permission android:name="android.permission.CAMERA"/> </manifest> ]]></manifestAdditions> </android>

こちらも、iOSでは設定する必要はありません。

CameraUIによる使用可能の確認と静止画の取得

アプリケーションを実行するデバイスにおいてCameraUIが使用可能かどうかは、CameraUIクラスのisSupportedプロパティの真偽値で判断します。使用可能であれば、CameraUIクラスのインスタンスを生成し、MediaEventクラスのCOMPLETEイベントをハンドルします。launchメソッドの引数にMediaTypeクラスのIMAGE定数を指定して呼び出すと、静止画の撮影に移行します。

if (CameraUI.isSupported) { var cameraUI:CameraUI = new CameraUI(); cameraUI.addEventListener(MediaEvent.COMPLETE, cameraUI_complete); cameraUI.launch(MediaType.IMAGE); }

キャンセルされずに撮影が行われたときは、上記のCOMPLETEのイベントハンドラが呼び出されます。

private function cameraUI_complete(event:MediaEvent):void { var loader:Loader = new Loader(); loader.loadFilePromise(event.data); addChild(loader); }

MediaEventクラスのdataプロパティには、撮影したデータを提供するMediaPromiseクラスのインスタンスが格納されています。これをLoaderクラスのloadFilePromiseメソッドに渡すことで、撮影した画像がロードされて、画面に表示されます。

CameraUIによる動画の取得

先ほどのCameraUIインスタンスのlaunchメソッドの引数に、MediaTypeクラスのVIDEO定数を指定して呼び出すと、動画の撮影に移行します。

if (CameraUI.isSupported) { var cameraUI:CameraUI = new CameraUI(); cameraUI.addEventListener(MediaEvent.COMPLETE, movie_complete); cameraUI.launch(MediaType.VIDEO); }

キャンセルされずに撮影が行われたときは、上記のCOMPLETEのイベントハンドラが呼び出されます。

private function movie_complete(event:MediaEvent):void { video = new Video(); addChild(video); var conn:NetConnection = new NetConnection(); conn.connect(null); var stream:NetStream = new NetStream(conn); stream.client = new Object(); video.attachNetStream(stream); stream.play(event.data.file.url); }

event.dataのMediaPromiseクラスのインスタンスのfileプロパティには、撮影した動画ファイルのFileクラスのインスタンスが格納されています。Videoクラスなどを利用して、そのファイル参照し、画面上で再生することができます。

iOSの場合は、動画ファイルはmovファイルとなるためVideoクラスで再生することはできません。そのためサンプル内では、StageWebViewを用いて表示しています(StageWebViewの詳細については、次回紹介します)。

撮影データの方向について

カメラから取得した画像/動画の方向は、撮影時のデバイスの向きではなく、各々のデバイスで決められた方向で渡されてきます。例えば、以下はiPod touchでサンプル03_Cameraを使い、時計を正面(12時を上にして)から撮影したものです。

縦向きで撮影した場合は、実際の撮影時に対して-90度回転した状態で取得されています。つまり、iPhone/iPod touchでは、ホームボタンが右にある状態(横向き)で撮影した場合は、撮影時の方向とデータ取得時の方向が一致します。しかし、Android端末によっては、このようになるとは限りません。OSごとではなくデバイスによって方向が異なるため、アプリケーション側で画像の回転機能を入れるなど考慮する必要があります。これはCameraクラスでも同様です。

カメラロール機能

カメラロールはAndroidやiOSに標準で搭載されている機能で、デバイス内(Androidの場合は、Webサービスも含む)に保存された画像ファイルをリスト表示させることができます。Adobe AIRではCameraRollクラスを使って、このカメラロールから画像を取得したり、カメラロールへ追加したりすることが可能です。なお、カメラロールから取得できるのは静止画だけです。

カメラロールからの画像取得

カメラロールの画像取得が使用可能かどうかは、CameraRollクラスの supportsBrowseForImageプロパティの真偽値で判断します。使用可能であれば、CameraRollクラスのインスタンスを生成し、MediaEventクラスのSELECTイベントをハンドルします。browserForImageメソッドを呼び出すと、画面がカメラロールに移行します。

if (CameraRoll.supportsBrowseForImage) { var cameraRoll:CameraRoll = new CameraRoll(); cameraRoll.addEventListener(MediaEvent.SELECT, cameraRoll_select); cameraRoll.browseForImage(); }

キャンセルされずに画像が選択されたときは、上記のSELECTのイベントハンドラが呼び出されます。

private function cameraRoll_select(event:MediaEvent):void { var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderInfo_complete); loader.loadFilePromise(event.data); addChild(loader); }

画像データへのアクセスは、先ほどのCameraUIと同様に、event.dataに格納されたMediaPromiseクラスのインスタンスから行います。

iOSのiPadにおけるカメラロールの表示位置について

iPadでは、iPhone/iPod touchやAndroidのようにカメラロールが全画面で表示されず、現在の画面に吹き出しのように表示されます。Objective-CによるUIKitを利用したネイティブなiOSアプリではこの吹き出し元の位置を指定することができますが、Adobe AIRアプリではiOS 4のiPadにおいて吹き出し元が隠れて左上に固定表示されるので注意が必要です。

カメラロールに画像の追加

カメラロールに画像を追加することもできます。この機能をサポートしているかどうかは、CameraRollクラスのsupportsAddBitmapDataプロパティの真偽値で判断します。CameraRollクラスのインスタンスを生成し、addBitmapDataメソッドにBitmapDataクラスのインスタンスを渡して呼び出すと、画像がカメラロールに追加されます。

if (CameraRoll.supportsAddBitmapData) { var cameraRoll:CameraRoll = new CameraRoll(); cameraRoll.addBitmapData(bitmapData); }

おわりに

Adobe AIR 2.5以降に導入されたモバイル向けAPIについて解説しました。特にCameraUIとカメラロールは簡単に使うことができるため、様々なアプリケーションで利用する場面が多いと思います。途中で出てきたStageWebViewなど、次回も引き続きモバイル向けAPIについて解説していきます。

関連記事