Как запустить внешний SWF внутри приложения Flex? - PullRequest
5 голосов
/ 26 апреля 2010

РЕДАКТИРОВАТЬ: Из-за ответа я изменяю опубликованный код. Я добавил строку 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 ]

18 голосов
/ 04 мая 2010

Вы можете попытаться временно загрузить 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
}
2 голосов
/ 26 апреля 2010

Если они загружаются из разных доменов, вам нужно добавить исключение безопасности - 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

1 голос
/ 02 мая 2010

Предполагая, что внешний SWF-файл также находится в каталоге приложения, вы можете попробовать загрузить его, используя схему app:/:

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

, которая может поместить его в тот же контекст безопасности, что и основное приложение.

0 голосов
/ 04 февраля 2014

это не будет работать для проекторов Flex.

Только мы используем SWFLoader и LocalConnection, потому что они могут взаимодействовать между внешним SWF и основным SWF. Спасибо за поддержку!

Можете ли вы прочитать мой учебник на форуме Adobe

Это намного лучше, чем MovieClip или Object-Callers

Спасибо за решенное решение:)

С уважением, Дженс

0 голосов
/ 14 ноября 2012

Одна вещь, которую вы можете рассмотреть, заключается в том, что если вы пытаетесь запустить SWF из каталога приложения в AIR, 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;
...