2010-04-26 71 views
5

編輯:由於答案我更改發佈的代碼。我已經添加了Security.allowDomain("*")行,該行會引發錯誤。那麼,怎麼做呢?如何在Flex應用程序中運行外部SWF?

我想在Flex應用程序中運行一個Action Script 3.0應用程序。要做到這一點,我已經做了以下內容:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication windowComplete="loadSwfApplication()" xmlns:mx="http://www.adobe.com/2006/mxml"> 

    <mx:Script> 
     <![CDATA[ 
      private function loadSwfApplication() 
      { 
       // The next line throws me an error. 
       Security.allowDomain("*"); 

       var urlRequest:URLRequest = new URLRequest("path/to/the/application.swf"); 
       swfLoader.addEventListener(Event.COMPLETE, loadComplete); 
       swfLoader.load(urlRequest); 
      } 

      private function loadComplete(completeEvent:Event) 
      { 
       var swfApplication:* = completeEvent.target.content; 
       swfApplication.init(); // this is a Function that I made it in the Root class of swfApplication 
      } 
     ]]> 
    </mx:Script> 

    <mx:SWFLoader id="sfwLoader"/> 

</mx:WindowedApplication> 

的問題是,在swfApplication.init();的AIR播放器的調用拋出了我的異常:

安全性違規:呼叫者文件:///路徑/to/the/application.swf無法訪問由應用程序擁有的Stage:/SWFApplicationLoader.swf。

這是因爲某處application.swf我用這樣的階段:

if (root.stage != null) 
    root.stage.addEventListener(Event.REMOVED, someFunction); 
root.stage.stageFocusRect = false; 

我如何可以加載這個SWF應用程序和使用階段,沒有任何問題?

回答

18

您可以嘗試將您的SWF暫時加載到ByteArray中,然後使用您的SWFLoader加載它。

不要忘記將allowLoadBytesCodeExecution設置爲true,因爲您的SWF具有內部代碼。

當然,請確保您的加載的swf對於您的應用程序來說足夠安全,因爲它可以訪問您的所有財產。你可能要考慮

private function loadSwfApplication():void { 
    // load the file with URLLoader into a bytearray 
    var loader:URLLoader=new URLLoader(); 

    // binary format since it a SWF 
    loader.dataFormat=URLLoaderDataFormat.BINARY; 
    loader.addEventListener(Event.COMPLETE, onSWFLoaded); 

    //load the file 
    loader.load(new URLRequest("path/to/the/application.swf")); 
} 
private function onSWFLoaded(e:Event):void { 
// remove the event 
var loader:URLLoader=URLLoader(e.target); 
loader.removeEventListener(Event.COMPLETE, onSWFLoaded); 

// add an Application context and allow bytecode execution 
var context:LoaderContext=new LoaderContext(); 
context.allowLoadBytesCodeExecution=true; 

// set the new context on SWFLoader 
sfwLoader.loaderContext = context; 

sfwLoader.addEventListener(Event.COMPLETE, loadComplete); 

// load the data from the bytearray 
sfwLoader.load(loader.data); 
} 

// your load complete function 
private function loadComplete(completeEvent:Event):void { 
var swfApplication:* = completeEvent.target.content; 
swfApplication.init(); // this is a Function that I made it in the Root 
         // class of swfApplication 
} 
+0

這也適用於移動平臺嗎?如果是的話,你可以寫一個適用於iOS的Flash播放器。 – sydd 2011-09-03 22:44:57

+0

任何想法,爲什麼這與字節數組,但不swfloader組件的作品? – buddyp450 2013-03-20 07:56:53

2

如果他們正在從你將不得不增加一個安全異常不同的域加載 - http://livedocs.adobe.com/flex/3/html/help.html?content=05B_Security_08.html

如果正在運行本地的youre可能將不得不把它們添加到信任的文件或文件夾列表設置管理器 - http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html#117502

+0

當我嘗試添加安全異常它會引發一個錯誤: 'SecurityError:錯誤#3207:應用程序 - 沙箱內容無法訪問此功能。 \t at flash.system :: Security $/allowDomain()' – 2010-04-29 18:56:29

+0

它已被添加到設置管理器中的可信文件中。 – 2010-04-29 18:57:25

1

假設外部SWF也是在應用程序目錄,你可以嘗試使用app:/方案加載它:

var urlRequest:URLRequest = new URLRequest("app:/path/application.swf"); 

可能把它放到與主應用程序相同的安全上下文中。

0

的一件事是,如果你正試圖從AIR應用程序目錄中運行的SWF,AIR限制文件的執行。如果您將該文件複製到一個臨時文件並運行(與allowLoadBytesCodeExecution一起設置爲true),那麼它就起作用了。

var file:File = File.applicationDirectory.resolvePath("myFile.swf"); 
this.tmpFile = File.createTempDirectory().resolvePath("myFile.swf"); 
file.copyTo(this.tmpFile); 

imagePreview.loaderContext = lc; 
imagePreview.source = tmpFile.url; 
0

它不適用於Flex投影儀。

只有我們使用SWFLoader和LocalConnection,因爲它們可以在外部swf和主swf之間進行通信。感謝你的支持!

您可以閱讀Adobe's Forum

我的教程它比影片剪輯或對象的來電者非常好

感謝解析解:)

最好的問候,延

相關問題