调试模式下,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 desktop中 如何截获 嵌入本地flash 的事件,在浏览器中可以,在桌面就不行了
安全域…
我用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,这个可行吗?
如果可以麻烦,请给我的邮箱发消息,再次不胜感激!!!
@393725437
可能是你的as版本有问题。两个类,类名、包名相同,但是里面具体实现不一样,这样会导致类似这样的问题。你需要重新统一编译下。