使用Flash在電腦與Android間開發(fā)局域網(wǎng)P2P項(xiàng)目
要求
你需要先安裝下列產(chǎn)品:
Flash Professional CS5
Flash Professional CS5上的AIR for Android開發(fā)插件
示例文件:
- P2P_example.zip(ZIP, 311K)
預(yù)備知識
- 會使用Flash Pro制作和發(fā)布項(xiàng)目
- ActionScript 3.0中級編程水平
使用FLASH PROFESSIONAL CS5開發(fā)運(yùn)行于ANDROID平臺的AIR2.5應(yīng)用
Android 2.2平臺支持Adobe AIR運(yùn)行時(shí)環(huán)境,版本為2.5,使用開發(fā)工具Flash Builder Burrito可以基于Flex SDK 4.5 (Hero)開發(fā)一個(gè)AIR2.5的應(yīng)用,對于Flash Pro用戶來說,使用裝有AIR for Android插件的Flash Pro CS5同樣可以方便快速地開發(fā)一個(gè)手機(jī)應(yīng)用。
如果你沒有安裝Flash Profession CS5,請到這里下載試用版,然后再到Adobe實(shí)驗(yàn)室下載AIR2.5開發(fā)插件(Beta 2),安裝成功后打開Flash,在開始畫面中新建一個(gè)AIR for Android文檔。這篇帖子用MAC 英文版的Flash Pro舉例。
圖1. 在Flash Profession CS5中新建一個(gè)AIR for Android項(xiàng)目
由于安裝了AIR2.5開發(fā)包,F(xiàn)lash Professional CS5便可以作為一個(gè)發(fā)布AIR2.5的工具,打開Publish Settings,看到Flash的發(fā)布環(huán)境是AIR Android,點(diǎn)擊右面的設(shè)置按鈕,可以進(jìn)入AIR2.5的發(fā)布設(shè)置面板:
圖2. AIR2.5的發(fā)布設(shè)置面板
General里是一些關(guān)于應(yīng)用的基本信息,Android平臺下的應(yīng)用安裝包是APK文件,在這個(gè)面板里可以直接給APK文件命名,并且定義應(yīng)用程序名稱。需要注意的是在App ID這一項(xiàng)里可以定義應(yīng)用程序ID,id值不能有下劃線等特殊字符,否則編譯的時(shí)候會報(bào)錯(cuò)。
在Aspect ratio里可以設(shè)置應(yīng)用在手機(jī)中的顯示方式為橫向(landscape)或者縱向(portrait)。也可以指定是否全屏或者是否按設(shè)備的傾斜方向自動調(diào)整橫縱顯示(Auto orientation)。
接下來是設(shè)置圖像的渲染方式,這里有三個(gè)選項(xiàng)Auto,CPU和GPU,如果選擇了GPU,會優(yōu)先使用設(shè)備的顯卡來渲染圖像,不同的設(shè)備顯卡有不同的限制,所以如果選擇這一項(xiàng)需要在多個(gè)設(shè)備中測試以確保無誤。Android的GPU有如下幾點(diǎn)限制:
- 不支持濾鏡效果
- 不支持PixelBender的圖片疊加和填充效果
- 不支持以下的圖像疊加效果:layer,alpha,erase,overlay,hardlight,lighten,darken
- 不建議選擇GPU來渲染視頻
如果使用GPU渲染,軟鍵盤打開時(shí)輸入框不會自動調(diào)整到可視范圍內(nèi),所以需要將文本框位置固定在上半屏。
如果一個(gè)顯示對象不能被GPU渲染,比如加了濾鏡的影片剪輯,它會完全不顯示。
圖3. 在Deployment面板中設(shè)置部署和發(fā)布參數(shù)
Deployment是部署和發(fā)布的一些設(shè)置,如同發(fā)布一個(gè)桌面版的AIR應(yīng)用程序一樣,發(fā)布Android AIR也需要驗(yàn)證。
在Android部署類型(Deployment Type)中可以選擇Device release,Emulator release和Debug。如果選擇了Debug,可以通過網(wǎng)絡(luò)在設(shè)備與Flash間建立一個(gè)測試環(huán)境,在Flash里打開Debug->Begin Remote Debug Session->ActionScript 3.0,并且在設(shè)備中顯示的對話框中輸入主機(jī)的IP地址和主機(jī)名稱。
After publishing可以選擇安裝應(yīng)用到設(shè)備中,并且同時(shí)運(yùn)行應(yīng)用,建議勾選兩項(xiàng)。
Icons 是用來設(shè)置應(yīng)用的顯示圖標(biāo)(36×36, 48×48, 72×72),圖片支持PNG文件。
圖4. 在Permissions中設(shè)置INTERNET權(quán)限
Permissions是設(shè)置應(yīng)用的訪問權(quán)限,因?yàn)楸纠枰_發(fā)一個(gè)P2P的網(wǎng)絡(luò)應(yīng)用,所以需要選擇INTERNET這一項(xiàng)。
接下來就是在移動設(shè)備上(本例為HTC Desire)的設(shè)置,打開設(shè)置->應(yīng)用程序->開發(fā),選擇"USB調(diào)試",便可以使用USB將設(shè)備與電腦連接,并發(fā)布一個(gè)AIR2.5應(yīng)用。
使用FLASH P2P技術(shù)在局域網(wǎng)內(nèi)搭建一個(gè)NETGROUP連接
Flash P2P (Pear to Pear)技術(shù)允許各個(gè)聯(lián)網(wǎng)客戶端使用Real-Time Media Flow Protocol (RTMFP)協(xié)議進(jìn)行點(diǎn)對點(diǎn)通訊。在廣域網(wǎng)需要連接到支持RTMFP協(xié)議的服務(wù)器,在局域網(wǎng)則不需要服務(wù)器,可以使用組播地址(Multicast address)進(jìn)行通訊。P2P需要通過用戶數(shù)據(jù)報(bào)協(xié)議(UDP)來傳輸數(shù)據(jù),所以確保你的網(wǎng)關(guān)沒有阻止UDP協(xié)議。
如果你不確定你的設(shè)備是否支持UDP通訊,請用手機(jī)瀏覽器訪問這個(gè)網(wǎng)址http://cc.rtmfp.net來自動檢測你的網(wǎng)絡(luò)狀態(tài)。
這里介紹一個(gè)在局域網(wǎng)內(nèi)建立P2P的例子,基本思路是建立一個(gè)NetConnection,然后搭建一個(gè)NetGroup,也就是通訊團(tuán)隊(duì),最后與團(tuán)隊(duì)中其他鄰居進(jìn)行廣播通訊。
使用NetConnection建立連接,如果參數(shù)為"rtmfp:",則會建立一個(gè)局域網(wǎng)連接。
- nc = new NetConnection();
- nc.addEventListener(NetStatusEvent.NET_STATUS,netStatus);
- nc.connect("rtmfp:");
使用NetGroup建立通訊團(tuán)隊(duì),在GroupSpecifier里可以指定團(tuán)隊(duì)id,通過它可以建立PIN碼來進(jìn)行用戶過濾。按下面的代碼可以建立一個(gè)NetGroup團(tuán)隊(duì),如果要搭建局域網(wǎng)P2P,則必須使用組播地址(Multicast Address), 并且指定地址IP和端口,請查閱這里了解更多關(guān)于組播地址的信息。
- private function setupGroup():void{
- var gs:GroupSpecifier = new GroupSpecifier("localgroup");
- gs.ipMulticastMemberUpdatesEnabled = true;
- gs.multicastEnabled = true;
- gs.postingEnabled = true;
- gs.routingEnabled = true;
- gs.addIPMulticastAddress("239.254.254.2:30303");
- ng = new NetGroup(nc,gs.groupspecWithoutAuthorizations());
- ng.addEventListener(NetStatusEvent.NET_STATUS,netStatus);
- }
偵聽NetStatusEvent事件來獲取網(wǎng)絡(luò)狀態(tài),NetStatusEvent偵聽器是團(tuán)隊(duì)內(nèi)通訊的窗口。如果鄰居連接到了NetGroup,便可以使用myNetGroup.post方法來廣播消息對象,對方通過NetGroup.Posting.Notify來獲取消息。
- private function netStatus(pEvent:NetStatusEvent):void{
- dispatchEvent(pEvent);
- switch(pEvent.info.code){
- case "NetConnection.Connect.Success":
- setupGroup();
- break;
- case "NetGroup.Connect.Success":
- dispatchEvent(new NetEvent(NetEvent.CONNECTED));
- break;
- case "NetGroup.Neighbor.Connect":
- dispatchEvent(new NetEvent(NetEvent.NEIGHBOR_CONNECTED));
- break;
- case "NetGroup.Posting.Notify":
- dispatchEvent(new NetEvent(NetEvent.POSTING_NOTIFY));
- dataObject = pEvent.info.message;
- break;
- }
- }
需要注意的幾點(diǎn)問題:
首次連接的時(shí)間根據(jù)網(wǎng)絡(luò)狀態(tài)的不同可能會很長,尤其是無線網(wǎng)絡(luò)。
使用手機(jī)的WiFi熱點(diǎn)來建立連接,熱點(diǎn)機(jī)與電腦無法連接。
圖5. 運(yùn)行效果
關(guān)于作者
李鵬(James Li),2001年畢業(yè)于吉林大學(xué)商學(xué)院,同年接觸Photoshop,Illustrator和Flash。畢業(yè)后一直在從事Flash的設(shè)計(jì)與開發(fā),在教育、IT、互聯(lián)網(wǎng)廣告等不同領(lǐng)域里做過4年的Flash設(shè)計(jì)師和5年的AIR程序開發(fā),期間曾在2006與2008年兩次去德國工作,對Flash前端交互設(shè)計(jì)有獨(dú)到的見解和豐富的經(jīng)驗(yàn)。