如何在Flex应用程序中运行外部SWF?

时间:2010-04-26 13:40:35

标签: actionscript-3 flash air flex4

编辑:由于答案,我更改了发布的代码。我添加了 Security.allowDomain("*") 行,该行会引发错误。那么,怎么做呢?

我想将Action Script 3.0应用程序运行到Flex应用程序中。为此,我做了以下事情:

<?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 Player会抛出异常:

安全沙箱违规:来电者文件:///path/to/the/application.swf无法访问应用所拥有的舞台:/SWFApplicationLoader.swf。

这是因为application.swf中的某个地方我使用这样的舞台:

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

如何加载此swf应用程序并使用舞台而没有任何问题?

5 个答案:

答案 0 :(得分:18)

您可以尝试暂时将SWF加载到ByteArray,然后将其加载到SWFLoader

不要忘记将allowCodeImport设置为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.allowCodeImport=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
}

答案 1 :(得分:2)

如果从不同的域加载它们,则必须添加安全例外 - http://livedocs.adobe.com/flex/3/html/help.html?content=05B_Security_08.html

如果它在本地运行,您可能需要将它们添加到设置管理器中的受信任文件或文件夹列表中 - http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html#117502

答案 2 :(得分:1)

假设外部SWF也在应用程序目录中,您可以尝试使用app:/方案加载它:

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

这可能会将其置于与主应用程序相同的安全上下文中。

答案 3 :(得分: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;

答案 4 :(得分:-1)

它不适用于Flex投影仪。

只有我们使用SWFLoader和LocalConnection,因为它们可以在外部swf和主swf之间进行通信。感谢您的支持!

您能否从Adobe's Forum

阅读我的教程

它比MovieClip或Object-Callers

更好

感谢解决方案:)

最好的问候,Jens