加载到基于Air的AS3 / Flex应用程序的AS2 / 1文件中的loadMovieNum

时间:2011-08-24 16:11:57

标签: flex actionscript flex4 air

我正在处理用AS1和AS2编写的大量旧版SWF。这些SWF广泛使用loadMovieNum

我正在尝试将这些应用程序集成到一个新的基于Air的应用程序中(用AS3或Flex编写)。但是,loadMovieNum似乎无法在Air应用程序中运行。

例如,AS2 SWF(file1.swf)可能会尝试使用以下方法加载另一个AS2 SWF:

loadMovieNum("http://127.0.0.1/file2.swf", 5);

如果SWF是独立播放的,但是如果它是在Air应用程序中播放,则可以正常工作,但它会失败。

编辑:Air应用中发生的事情是file1.swf将成功加载,但无法加载file2.swf。没有错误也没有例外。 <{1}}周围try...catch报告任何内容,loadMovieNum继续播放。

Air应用程序的相关代码如下:

AS3版本:

file1.swf

Flex版:

var mLoader:Loader = new Loader();
var mRequest:URLRequest = new URLRequest("http://127.0.0.1/file1.swf");
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
mLoader.load(mRequest, loaderContext);

function onCompleteHandler(loadEvent:Event):void
{
    // Add to the stage
    addChild(mLoader.content.parent);
}

只是<mx:SWFLoader id="swfObj" source="http://127.0.0.1/file1.swf" /> 无法在Air中运行?或者有什么可以做的。显然,对传统SWF进行大量更改是不可能的。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我得出结论,直接加载到Air应用程序的SWF中不支持_level。例如,偶数_level0(应始终定义)返回undefined。因此,loadMovieNum似乎不太可能得到支持。

但是,我发现了一种解决方法。使用Air中的HTML浏览器组件,可以将一个嵌入了AS2 / 1 SWF的网页加载到Air应用程序中。如果您这样做,那么loadMovieNum在AS2 / 1文件中按预期工作。

AS3版本:

var hLoader:HTMLLoader = new HTMLLoader();
addChild(hLoader);
hLoader.width = stage.stageWidth;
hLoader.height = stage.stageHeight;         
hLoader.load(new URLRequest("file1.html"));

Flex版:

<mx:HTML id="minibrowser" width="100%" height="100%" location="file1.html" />

不幸的是,所有Air配置文件都不支持HTML组件。特别是在我的情况下,电视配置文件不支持它。

答案 1 :(得分:0)

虽然看起来可能不直观,但这似乎是一个安全问题。当AS2内容加载其他AS2内容时,它们必须位于同一安全沙箱中才能运行。

为了测试这个理论,我创建了一个快速样本,我是对的。它在Flash中工作的原因是因为AS2内容与其加载的内容位于同一个沙箱中。但AIR安全性不同。因此,当您在AIR中加载AS2内容(使用您提供的逻辑)时,加载器将被放入应用程序沙箱中。沙箱现在与其加载的内容不同,因此它拒绝加载它们。 这解释了为什么它在使用HTML包装器时有效。当HTML加载swf时,它可能会被放入local-with-network沙箱中,该沙箱与内容相同。

所以...你如何解决它? 您可以尝试在不同的安全沙箱中加载内容。但实际上问题是AS3安全性与AS2安全性不相称。我的建议是在没有AS3包装器的情况下创建AIR应用程序。您不能直接在工具中执行此操作,但您应该能够使用ADT打包程序来执行此操作。在xml描述符中,将初始内容设为AS2 swf,并将其打包在一起。现在,当您启动AIR应用程序时,它使用AS2 swf作为主应用程序。突然,您的文件应该都在同一个安全沙箱中,Flash不会阻止任何内容运行。

您可以使用ADL本地测试此应用程序,而不是直接从Flash Professional或Flash Builder启动应用程序。 (它们都使用ADL,但如果直接调用它,则可以更好地控制所使用的参数。)

编辑:显然,您不能将AS2 swf作为桌面AIR应用程序的主swf。 (我已经在桌面上使用ADL进行了测试,但它有效,但我被告知您无法使用此设置在桌面上安装AIR应用程序。)因此,对于桌面,您可能希望使用HTML解决方法。 AIR for TV 支持此功能,因此这适用于这些设备。