Laan's steps..

Feed Rss

air加载本地swf并与之通信

10.13.2008, air, by .

调试模式下,air加载本地swf后便可与该swf通信了。
不过发布后就不能了,需要多一步操作:

var swfHandler:Loader = new Loader();

var swfFile:File = new File(AppController.joinPath(componentPath, mainFile));
var stream: FileStream = new FileStream();
stream.open(swfFile, FileMode.READ);

var swfBytes: ByteArray = new ByteArray();
stream.readBytes( swfBytes );
stream.close();

var context:LoaderContext = new LoaderContext();
context.allowLoadBytesCodeExecution = true;
swfHandler.loadBytes(swfBytes, context);

关键是使用loadercontent来设置allowLoadBytesCodeExecution值为true
这样的话两者之间就可以执行相互的代码。

不过这个时候存在一个域的问题
比如你在swf里面定义了一个laan.flash.MessageEvent类,它存在与swf所在域中
而你在air里也定义了一个laan.flash.MessageEvent类,存在与air所在域中
这个时候在air里面产生的MessageEvent实例传递到swf中是不能转换的
不过你可以在air里面定方法获取air中的MessageEvent类:
public function getMessageEventClass():Class {
return MessageEvent;
}

然后在swf中:
var msgClass:Class = …..getMessageEventClass();
var msgEvent = new msgClass();
然后传递中就不会有错误。

呵呵 这样好像比较麻烦的
另一个更好的办法就是使用ApplicationDomain的方法
getDefinition()以及hasDefinition()
这样可是在二者之间共享类
当然首先你得将swf加载到air域中

var context:LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;

然后再load(new URLRequest(url), context);

总而言之呢,flashplayer(当然包括AIR)的安全以及域内容是比较诡异的
同时又很有用
我所掌握的还不及十分之一
确实是比较高深 加倍努力吧

air加载本地swf并与之通信 有 3 条回应

  1. 请问 air desktop中 如何截获 嵌入本地flash 的事件,在浏览器中可以,在桌面就不行了

    回复
  2. 2010-05-19 在 17:50 393725437

    安全域…
    我用air加载了一个其他目录下的swf,然后试图得到这个swf中的一个class.但是失败…(我其实就是想用air加载一个aswing的皮肤,哎)

    加载代码:
    //context.applicationDomain= new ApplicationDomain(ApplicationDomain.currentDomain);
    //context.applicationDomain= new ApplicationDomain(null);
    //context.applicationDomain = ApplicationDomain.currentDomain;
    // 如上面这样的安全域设置,这3个的参数都用过了,还是失败… T_T …
    //===============================
    //这里是接收
    var skin:Class = urlload.loader.contentLoaderInfo.applicationDomain.getDefinition(“Clazz”) as Class;
    UIManager.setLookAndFeel(new skin());
    //============================
    // 报错是
    Type Coercion failed: cannot convert org.skin::OrangeLookAndFeel@5289c29 to org.aswing.LookAndFeel.

    折腾了一天,都没搞定,很迷糊这个安全域要怎么搞才好.
    麻烦你看能看看分析下吗?
    加载其他目录下swf,并能调用其中的class,这个可行吗?
    如果可以麻烦,请给我的邮箱发消息,再次不胜感激!!!

    回复
  3. @393725437
    可能是你的as版本有问题。两个类,类名、包名相同,但是里面具体实现不一样,这样会导致类似这样的问题。你需要重新统一编译下。

    回复

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>