2010-04-26 36 views
5

EDIT: Do câu trả lời tôi thay đổi mã được đăng. Tôi đã thêm dòngSecurity.allowDomain("*")và dòng đó ném cho tôi một lỗi. Vì vậy, làm thế nào có thể được thực hiện?Làm thế nào để chạy một SWF bên ngoài trong một ứng dụng Flex?

Tôi muốn chạy ứng dụng Action Script 3.0 vào ứng dụng Flex. Để làm điều này tôi đã thực hiện như sau:

<?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> 

Vấn đề là trong sự kêu gọi của swfApplication.init(); AIR chơi ném cho tôi một ngoại lệ:

an sandbox vi phạm: tập tin gọi: /// đường /to/the/application.swf không thể truy cập Giai đoạn do ứng dụng sở hữu: /SWFApplicationLoader.swf.

Điều này là do đâu đó trong application.swf tôi sử dụng giai đoạn như thế này:

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

Làm thế nào tôi có thể tải ứng dụng này swf và SỬ DỤNG sân khấu mà không cần bất kỳ vấn đề?

Trả lời

18

Bạn có thể thử tải SWF tạm thời vào ByteArray và sau đó tải nó với SWFLoader.

Đừng quên đặt allowLoadBytesCodeExecution thành true vì SWF của bạn có mã bên trong.

Tất nhiên, hãy đảm bảo rằng swf đã tải của bạn đủ an toàn cho ứng dụng của bạn vì nó sẽ có quyền truy cập tại tất cả tài sản của bạn.

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

Tính năng này có hoạt động trên nền tảng di động không? Nếu có, bạn có thể viết trình phát Flash cho iOS. – sydd

+0

Bất kỳ ý tưởng nào tại sao tính năng này hoạt động với một mảng byte nhưng không hoạt động với thành phần của trình swfloader? – buddyp450

2

Nếu họ đang được nạp từ các miền khác nhau, bạn sẽ có thêm một ngoại lệ an ninh - http://livedocs.adobe.com/flex/3/html/help.html?content=05B_Security_08.html

nếu nó được cài đặt trên server bạn đang có lẽ sẽ phải thêm chúng vào danh sách các tập tin hoặc thư mục đáng tin cậy trong người quản lý cài đặt - http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html#117502

+0

Khi tôi cố gắng thêm ngoại lệ bảo mật nó ném cho tôi một lỗi: 'SecurityError: Lỗi # 3207: Nội dung ứng dụng-sandbox không thể truy cập tính năng này. \t tại flash.system :: Bảo mật $/allowDomain() ' –

+0

Và nó đã được thêm vào các tệp đáng tin cậy trong trình quản lý cài đặt. –

1

Giả sử rằng các SWF bên ngoài cũng nằm trong thư mục ứng dụng, bạn có thể thử tải nó bằng cách sử dụng app:/ Đề án:

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

đó có thể đặt nó vào cùng một ngữ cảnh bảo mật như ứng dụng chính.

0

Một điều bạn có thể muốn xem xét là nếu bạn đang cố gắng chạy SWF từ bên trong thư mục ứng dụng trong AIR, AIR sẽ hạn chế thực thi tệp. Nếu bạn sao chép tệp vào tệp tạm thời và chạy tệp đó (cùng với allowLoadBytesCodeExecution đặt thành true) thì tệp đó hoạt động.

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

nó sẽ không hoạt động đối với máy chiếu Flex.

Chỉ chúng tôi sử dụng SWFLoader và LocalConnection vì chúng có thể giao tiếp giữa swf ngoài và swf chính. Cám ơn vì hỗ trợ!

Bạn có thể đọc hướng dẫn của tôi từ Adobe's Forum

Nó là rất tốt hơn so với MovieClip hoặc Object-Người gọi

Thank cho giải pháp giải quyết :)

Trân trọng, Jens

Các vấn đề liên quan