Загрузка Swf с помощью bytearray в AIR - PullRequest
4 голосов
/ 25 января 2011

У нас есть требование к приложению AIR, которое загружает сгенерированный SWF-файл, который в свою очередь загружает SWF-файл, сгенерированный с помощью SWFLoader.Это не работает, как хотелось бы.Это приводит к следующей ошибке: SecurityError: Ошибка # 3226: невозможно импортировать SWF-файл, если LoaderContext.allowCodeImport имеет значение false.

Это наше приложение AIR.

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="initApp()">
<mx:Script>
<![CDATA[

import mx.controls.SWFLoader;

[Embed(source="FlexLoadingFlash.swf")]
public var flexMovie:Class;

private function initApp():void {
    // First convert the Swf into MovieClip
    var movieclip:MovieClip = new flexMovie();

    // get the byteArray from movieClip
    var byteArray:ByteArray = movieclip.movieClipData; 

    var swfLoader:SWFLoader = new SWFLoader();

    // load bytearray into swfLoader
    swfLoader.source = byteArray;

    swfLoader.maintainAspectRatio = false; 
    swfLoader.percentHeight = vbox.height;
    swfLoader.percentWidth = vbox.width;
    swfLoader.invalidateDisplayList();
    swfLoader.invalidateSize();

    // now add the swfloader into container
    vbox.addChild(swfLoader); 
} 

]]>

</mx:Script>

<mx:VBox id="vbox" width="100%" height="100%" verticalCenter="0" horizontalCenter="0" cacheAsBitmap="true" >

</mx:VBox>

</mx:WindowedApplication>

Пожалуйста, дайте мне знать, какмы можем решить эту проблему.

Ответы [ 3 ]

7 голосов
/ 25 января 2011

Используйте Loader.loadBytes () для загрузки вашего SWF. Создайте экземпляр LoaderContext. Метод loadBytes принимает экземпляр LoaderContext в качестве параметра. Установите для свойства allowCodeImport вашего экземпляра LoaderContext значение true, и оно должно работать

2 голосов
/ 20 ноября 2012
<mx:SWFLoader id="swfObj" 
    width="100%" height="100%"
    complete="swfObj_completeHandler(event)"/>

<fx:Script>   
    <![CDATA[
        [Bindable]
        [Embed(source="assets/soundbar.swf")]
        private static var swfClass:Class;

        private var swfSoundBar : MovieClip;

        [Bindable] private var mp3Player:MP3Player = MP3Player.getInstance();

        protected function init(event:FlexEvent):void
        {
            swfSoundBar = new swfClass();

            var byteArray:ByteArray = swfSoundBar.movieClipData; 

            var loaderContext: LoaderContext = new LoaderContext();
            loaderContext.allowLoadBytesCodeExecution = true; 
            swfObj.loaderContext = loaderContext;

            swfObj.source = byteArray;
        }

        protected function swfObj_completeHandler(event:Event):void
        {
            swfSoundBar = SWFLoader(event.target).content as MovieClip;
            swfSoundBar.width = 32;
            swfSoundBar.height = 14;

            swfSoundBarShowHide();
        }

        protected function swfSoundBarShowHide():void 
        {
            if (swfSoundBar){
                if (mp3Player.isPlaying){
                    swfSoundBar.gotoAndStop(0);
                    swfSoundBar.stop();
                } else {
                    swfSoundBar.gotoAndPlay(0);
                }   
            }               
        }

    ]]>
</fx:Script>
2 голосов
/ 24 ноября 2011

Или вы можете просто добавить эти три строки, прежде чем установить источник

var loaderContext: LoaderContext = new LoaderContext();
loaderContext.allowLoadBytesCodeExecution = true; 
swfLoader.loaderContext = loaderContext;
...