簡介開發運作於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
‧java-actionscript-api-for-android
‧Adobe Flash Builder 4.5 Android Air 程序开发系列 之四 打开与关闭应用程序是的保存数据 (必讀)