簡介開發運作於Android的AIR程式 - 2

簡介開發運作於Android的AIR程式 - 2

在上一篇<簡介開發運作於Android的AIR程式 - 1>介紹了如何建立一個簡單的AIR程式,並且包裝它讓它可以運作於有安裝

AIR Runtime的Android手機/平板運作。那麼,接下來此篇將更深入去說明,相關包裝AIR程式與透過ActionScript呼叫其他

Android程式的方式。

 

在往下介紹相關設定與開發之前,先針對目前AIR包裝時不支援的部分進行說明,減少開發時的遺漏。

[目前不支援的項目]

參考<開發行動裝置 AIR 應用程式 / 設定行動應用程式屬性 - Android 設定 >說明Android中的Manifest標籤下那些標籤無法使用:

1. manifest元素,無法設定以下的屬性:

    package、android:versionCode、android:versionName、xmlns:android;

2. activity元素,無法設定以下屬性:

    android:label、android:icon;

3. application元素,無法設定以下屬性:

    android:theme、android:name、android:label、android:windowsoftInputMode、android:configChanges、

    android:screenOrientation、android:lanuchMode;

4. uses-sdk元素,無法設定

   

以上了解了那些標籤目前還不支援後,接下來就仔細看相關詳細的設定:

〉包裝AIR與設定Manifest

a. 支援攝影機的使用

    開發Flash/Flex應用程式的個案裡,多多少少會與攝影機功能結合,配合現在AIR移植到Android平台裡,這個功能更不能少,

    AIR也提供透過設定的方式,讓開發支援攝影機功能時,也可以按需求來增加攝影機是否需要其他的功能,包括:自動對焦、

    閃光燈等功能,詳細範例如下:

   1: <android> 
   2:     <manifestAdditions> 
   3:         <![CDATA[ 
   4:             <manifest> 
   5:                 <!-- 宣告該App將使用CAMERA的功能,需要此權限 -->
   6:                 <uses-permission android:name="android.permission.CAMERA" /> 
   7:  
   8:                 <!-- 選擇性設定該CAMERA會用到的額外功能 -->
   9:                 <uses-feature android:name="android.hardware.camera" android:required="false"/> 
  10:                 <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/> 
  11:                 <uses-feature android:name="android.hardware.camera.flash" android:required="false"/> 
  12:             </manifest> 
  13:         ]]> 
  14:     </manifestAdditions> 
  15: </android>

    要特別注意,當設定了這個permission之後,當對方的Device沒有支援攝影機,它將無法在Market上找到你的程式。

 

b. 支援錄音機的使用

    使用方法與上述支援攝影機的方式相似,只是宣告需要麥克風的權限,也可按需求要求是否必要有麥克風功能,例如:

   1: <android> 
   2:     <manifestAdditions> 
   3:         <![CDATA[ 
   4:             <manifest> 
   5:                 <!-- 宣告使用麥克風權限 -->
   6:                 <uses-permission android:name="android.permission.RECORD_AUDIO" /> 
   7:                 <!-- 設定麥克風硬體非必要元素 -->
   8:                 <uses-feature android:name="android.hardware.microphone" android:required="false"/> 
   9:             </manifest> 
  10:         ]]> 
  11:     </manifestAdditions> 
  12: </android>

    要特別注意,當設定了這個permission之後,當對方的Device沒有支援攝影機,它將無法在Market上找到你的程式。

 

c. 支援包裝過的AIR程式(APK)安裝路徑

    在<Android - 開發可以安裝於SD Card的App>提供Android 2.2以後支援android:installLocation的屬性,到了AIR開發時也一樣有支援,

    但這個設定在Flash Builder工具裡面是看不到的,所以需透過手動設定,方法如下:

   1: <!-- 設定android:installLocation 屬性值:preferExternal或auto -->
   2: <android>
   3:     <manifestAdditions><![CDATA[
   4:         <manifest>
   5:             <attribute name="android:installLocation" value="preferExternal" />
   6:         </manifest> 
   7:     ]]></manifestAdditions>
   8: </android>

 

d. 自訂支援透過URI來啟動AIR程式

    這是一個非常特別的功能,提供讓Android系統在接收到特定的URI時,針對被註冊於URI協定清單中的App來進行搜尋,

    找出要啟動App。這樣的功能一樣在AIR程式也有支援,需設定幾個標籤,如下:

    d-1. 新增二個intent-filter標籤至<android>區域中的<application>裡:

           d-1-1. 第一個intent-filter定義該AIR執行的模式與類型;

           d-1-2. 第二個intent-filter定義該AIR要註冊於Android中URI Schema的類型,以my-uri為例;

   1: <android> 
   2:     <manifestAdditions<![CDATA[ 
   3:         <manifest> 
   4:             <application> 
   5:                 <activity> 
   6:                     <intent-filter> 
   7:                         <action android:name="android.intent.action.MAIN"/> 
   8:                         <category android:name="android.intent.category.LAUNCHER"/> 
   9:                     </intent-filter> 
  10:                     <intent-filter> 
  11:                         <action android:name="android.intent.action.VIEW"/> 
  12:                         <category android:name="android.intent.category.BROWSABLE"/> 
  13:                         <category android:name="android.intent.category.DEFAULT"/> 
  14:                         <!-- 指定URL Schema -->
  15:                         <data android:scheme="my-uri"/> 
  16:                     </intent-filter> 
  17:                 </activity> 
  18:             </application> 
  19:         </manifest> 
  20:     ]]> 
  21:     </manifestAdditions> 
  22: </android>

    d-2. 透過自訂URI叫用應用程式時,NativeApplication 物件會傳送 invoke 事件,包括查詢參數的連結 URL,

           找到對應的App設定後,放置於InvokeEvent 物件的 arguments 陣列中讓Android啟動該App。

           呼叫URI範例: <a href="my-uri://arg1=value&secondArgument=someValue">開啟air程式</a>

 

〉透過ActionScript呼叫Android程式

這個功能針對開發過Android App的開發者應該不陌生,在App裡要呼叫別人的App,只需知道對方App的Package Name,

就可以透過Intent的方式去呼叫,除了一些內鍵的Intent對象,例如:開啟Mail、通訊軟體、多個瀏覽器、文件管理功能等,

例如:<Launching Different Applications from Android Activity Using Intent>所說明。

那麼到了ActionScript裡,我要如何呼叫類似Intent模組的功能,讓我可以啟動其他的Application呢?

 

a. 可能方法一:[NativeApplication]

該類別是個關鍵模組,它負責處理整個AIR程式的運作流程,如果撰寫過關於AIR程式開發的經驗,對這個模組應該非常熟悉,

根據<Tip: Close Your Android AIR App on Back Button>此篇也針對NativeApplicaiton來控制App關閉,如下程式範例:

   1: //註冊NativeApplication針對Event事件的監聽
   2: NativeApplication.nativeApplication.addEventListener(Event.ACTIVATE, handleActivate, false, 0, true);
   3:  
   4: NativeApplication.nativeApplication.addEventListener(Event.DEACTIVATE, handleDeactivate, false, 0, true);
   5:  
   6: NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN, handleKeys, false, 0, true);
   7:  
   8:  
   9: //處理對應的事件邏輯
  10: private function handleActivate(event:Event):void
  11: {         
  12:     //保持AIR程式正常使用
  13:     NativeApplication.nativeApplication.systemIdleMode = 
  14:                 SystemIdleMode.KEEP_AWAKE; 
  15: }  
  16:  
  17: private function handleDeactivate(event:Event):void 
  18: {         
  19:     //關閉AIR程式
  20:     NativeApplication.nativeApplication.exit(); 
  21: }  
  22:  
  23: private function handleKeys(event:KeyboardEvent):void 
  24: {         
  25:     //當按鍵BACK鍵,關閉AIR程式
  26:     if(event.keyCode == Keyboard.BACK)         
  27:         NativeApplication.nativeApplication.exit();
  28: }

 

b. 可能方法二:[使用特定的URI Protocol]

還記得上述提到透過<intent-filter>定義指定的schema,配合特定的Action與Category就可以讓Android系統通知有對應Schema

的App進行動作嗎?透過這樣的方式,其實我們也可以從自己開發的App去啟動別人的App,但前提是需要知道對方的App有註冊

了那些schema去認定我們送出的URI。至於怎麼取得別人AndroidManifest.xml裡的資料,這個我還需要查查看。

 

======

以上是針對透過ActionScript與Flash Builder來建立AIR程式所做的介紹,並且提供比較深入開發時要注意的地方。

由於目前開發Android App都是直接使用Java語法來撰寫,但是對於已經熟悉ActionScript的開發人員,忽然要又

學其他語言並且要了解Mobile/Pad運作的一些特性與用戶體驗,其實是相當困難的,好在Adobe有提供這些對應

的設定方法與自動Generate的功能,讓開發人員可以方便一些。

 

如果有撰寫錯誤的地方,請大家告訴我。謝謝。

 

References:

開發行動裝置 AIR 應用程式 / 設定行動應用程式屬性  - Android 設定 (必讀)

My first AIR for Android development experience

Adobe Flash Builder 4.5 Android Air 程序开发系列 之三 Application 配置详解

<uses-feature> - the Hardware features (必讀)

<uses-feature> - the Software features

開發行動裝置 AIR 應用程式 (必讀)

AIR for Android - 行動應用程式設計注意事項 (必讀)

Air 3 on Android supports the intent: protocol!

Launching Different Applications from Android Activity Using Intent (必讀)

Android Launch an application from another application & Open another application from your own (intent)

Using the Activity Starter Component & Passing parameters from a java activity to Adobe AIR app

Extending AIR for Android & Android: Create your own sharing app

Christophe Coenraets

java-actionscript-api-for-android

Adobe Flash Builder 4.5 Android Air 程序开发系列 之四 打开与关闭应用程序是的保存数据 (必讀)

 

Dotblogs Tags: ,