2011-10-21 39 views
0

加載SWF並通過Adobe AIR 2.6 for Android中的類鏈接訪問其元素時遇到問題。請幫助,如果有人知道。加載具有相同類聯動問題的影片剪輯的不同swf

問題:
我有兩個不同的SWF文件:

file1.swf(其中的MovieClip與NAME1具有類聯動 'mainScreen')
file2.swf(其中的MovieClip與NAME2具有類linkage'mainScreen')

他們有一些動作腳本代碼,我需要在我的應用程序域中導入。
文件下載很好。
下載後他們在differen應用程序域
但是,當我被類聯動越來越元素,並將它們添加到舞臺 - 僅加載第二個顯示單元。看起來像第二個動畫片段,用相同的類連接代替第一個。

對於這個我用這樣的方法:

請幫助我如何可以加載兩種不同元素的SWF文件,它具有相同的類聯接元件,或者解釋爲什麼我不能這樣做呢? 當元素具有不同的類鏈接時 - 一切正常。但!!!它正在爲網絡工作,但對於空氣而言,它不想工作。

package 
{ 
    import flash.display.*; 
    import flash.display.Sprite; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 
    import flash.errors.*; 
    import flash.events.*; 
    import flash.net.*; 
    import flash.system.ApplicationDomain; 
    import flash.system.LoaderContext; 
    import flash.system.Security; 
    import flash.system.SecurityDomain; 
    import flash.utils.*; 
    import flash.utils.ByteArray; 

    import org.bytearray.explorer.SWFExplorer; 
    import org.bytearray.explorer.events.*; 



public class LoadSWFTest extends Sprite 
{ 
    private static const LOADERS_COUNT:int = 2; 

    private var asset_loader1:Loader; 
    private var asset_loader2:Loader; 
    private var finishedLoaders:int; 


    private var urlLoader1:URLLoader; 
    private var urlLoader2:URLLoader; 
    private var finishedURLLoaders:int; 

    private var movAssets:MovieClip; 
    private var movReels:MovieClip; 

    private static const initAssetsStr:String = "http://dl.dropbox.com/u/11/name1.swf"; 
    private static const reelsStr:String = "http://dl.dropbox.com/u/11/name2.swf"; 


    public function LoadSWFTest() 
    { 
     super(); 

     // support autoOrients 
     //stage.align = StageAlign.TOP_LEFT; 
     stage.scaleMode = StageScaleMode.EXACT_FIT; 
     this.scaleX = 0.5; 
     this.scaleY = 0.5; 

     this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
    } 

    private function onAddedToStage(event:Event):void 
    { 
     this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
     //draw black background 
     with(graphics) 
     { 
      beginFill(0x0) 
      drawRect(0,0,stage.stageWidth,stage.stageHeight); 
     } 
     initURLLoaders(); 
    } 

    private function initURLLoaders():void 
    { 
     finishedURLLoaders = 0; 
     trace("finishedLoaders: " + finishedURLLoaders); 

     //first loader 
     urlLoader1 = new URLLoader(); 
     urlLoader1.dataFormat = URLLoaderDataFormat.BINARY; 
     urlLoader1.addEventListener(Event.COMPLETE, loadCompleteURLLoaders); 
     var url1:URLRequest = new URLRequest(initAssetsStr);  
     urlLoader1.load(url1); 


     //reels 
     urlLoader2 = new URLLoader(); 
     urlLoader2.dataFormat = URLLoaderDataFormat.BINARY; 
     urlLoader2.addEventListener(Event.COMPLETE, loadCompleteURLLoaders); 
     var url2:URLRequest = new URLRequest(reelsStr); 
     urlLoader2.load(url2); 
    } 

    private function loadCompleteURLLoaders(event:Event):void 
    { 
     finishedURLLoaders += 1; 
     trace("loadCompleteURLLoaders. finishedURLLoaders: " + finishedURLLoaders); 
     if (finishedURLLoaders == LoadSWFTest.LOADERS_COUNT) 
     { 
      init(); 
     } 
    } 

    //init 
    private function init():void 
    { 
     finishedLoaders = 0; 
     trace("finishedLoaders: " + finishedLoaders); 

     var context1:LoaderContext = new LoaderContext(true); 
     context1.checkPolicyFile = false; 
     context1.allowCodeImport = true; 
     context1.applicationDomain = ApplicationDomain.currentDomain; 


     var context2:LoaderContext = new LoaderContext(true); 
     context2.checkPolicyFile = false; 
     context2.allowCodeImport = true; 
     context2.applicationDomain = ApplicationDomain.currentDomain; 

     var arr1:ByteArray = urlLoader1.data as ByteArray; 
     var arr2:ByteArray = urlLoader2.data as ByteArray; 


     //first loader 
     asset_loader1 = new Loader(); 
     asset_loader1.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
     asset_loader1.loadBytes(arr1, context1); 


     //reels 
     asset_loader2 = new Loader(); 
     asset_loader2.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete); 
     asset_loader2.loadBytes(arr2, context2); 
    } 

    private function loadComplete(event:Event):void 
    { 
     finishedLoaders += 1; 
     trace("loadComplete. finishedLoaders: " + finishedLoaders); 
     if (finishedLoaders == LoadSWFTest.LOADERS_COUNT) 
     { 
      downloadCompleted(); 
     } 
    } 

    private function downloadCompleted():void 
    { 
     trace("downloadCompleted"); 



     movAssets = getSkinAsset(asset_loader1, 'mainScreen1') as MovieClip; 
     movReels = getSkinAsset(asset_loader2, 'mainScreen2') as MovieClip; 

     addChild(movAssets); 


     setTimeout(showMovie, 5000); 
    } 

    private function showMovie():void 
    { 
     addChild(movReels); 
    } 

    /////////////////////////////////////////////// 
    public function hasAsset(asset_loader:Loader, assetName:String):Boolean 
    { 
     try 
     { 
      var assetClass:Class = asset_loader.contentLoaderInfo.applicationDomain.getDefinition(assetName) as Class; 
      return assetClass!=null; 
     } 
     catch(e:Error) 
     { 
      trace(e); 
      return false; 
     } 
     return false; 
    } 

    public function getSkinAsset(asset_loader:Loader, assetName:String):DisplayObject 
    { 
     try 
     { 
      trace("getSkinAsset: " + assetName); 
      var memoryHash:String; 

      try 
      { 
       FakeClass(asset_loader); 

      } 
      catch (e:Error) 
      { 
       memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1'); 
      } 
      trace("asset_loader: " + memoryHash); 

      try 
      { 

       FakeClass(asset_loader.contentLoaderInfo.applicationDomain); 
      } 
      catch (e:Error) 
      { 
       memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1'); 
      } 
      trace("app domain: " + memoryHash); 
      trace("Loader: " + asset_loader.contentLoaderInfo.url + " appDomain: " + asset_loader.contentLoaderInfo.applicationDomain); 



      var assetClass:Class = asset_loader.content.loaderInfo.applicationDomain.getDefinition(assetName) as Class; 
      var disObj:DisplayObject = new assetClass(); 
      return disObj; 
     } 
     catch(e:Error) 
     { 
      throw new IllegalOperationError('getSkinAsset('+assetName + ') - error msg: ' + e.message); 
     } 
     return null; 
    } 
} 

}

內部final類FakeClass {}

回答

0

我解決我的問題,但我不知道爲什麼就這樣在Adobe AIR:

和使用URLLoader加載後,我使用Loader.loadbytes通過Loader上下文將SWF導入到我的應用程序域中。

var context2:LoaderContext = new LoaderContext(true); 
     context2.checkPolicyFile = false; 
     context2.allowCodeImport = true; 

//if we comment this line of code - all works grate!  
//context2.applicationDomain = ApplicationDomain.currentDomain; 
相關問題