2011-10-21 11 views
0

Android用のAdobe AIR 2.6でクラスのリンクを使用してSWFを読み込んでその要素へのアクセスに問題があります。誰か知っていれば助けてください。同じクラスリンクの問題を持つムービークリップで別のswfをロードする

問題:
私は2つの異なるの.swfファイルがあります。NAME2とのMovieClipクラスを持っている

file1.swf(NAME1とのMovieClipクラスのリンケージ 'mainScreen' を持っている)
file2.swfを(リンケージ 'mainScreen')

私は自分のアプリケーションドメインでインポートする必要があるいくつかのアクションスクリプトコードを持っています。
ファイルをダウンロードしています。
ダウンロード後、それらは異なるアプリケーションドメインにあります
しかし、私はクラスリンケージによって要素を取得し、2番目に読み込まれたステージ専用の要素に追加します。同じクラスのリンケージを持つ2番目のムービークリップのように見えるので、最初のムービークリップが置き換えられます。このため

私は、このようなアプローチを使用しています:

してください、私は同じクラスのリンケージを持つ要素を持つ2つの異なる要素のSWFファイルをロードすることができますどのように役立つか、私はこれを行うことはできません理由を説明しますか? エレメントに異なるクラスリンケージがある場合は、すべてOKです。しかし!!!それはウェブのために働いていますが、空気のために働きたくありません。

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; 
関連する問題