乱七八糟的东西有很多 想到哪就写到哪吧
1.使用本地扩展
air中需要播放as2.0的swf文件,而air是不支持as2.0编写的swf的,解决方法只能是使用ane本地扩展,通过android的webview加载网络上的swf
ane部分使用以下网址的方法即可:
http://bbs.9ria.com/thread-156257-1-1.html? 这个是比较基础的使用方法
http://sswilliam.blog.163.com/blog/static/18969638320119285294592/?自定义activity等比较详细 的方法(推荐)
大体步骤就是在android端写上具体要实现的功能,export 为jar文件。创建as库文件,在里面对android端的端口进行调用,然后打包成ane,放入air工程中,调用库文件的端口。打包命令:
"C:Program FilesAdobeAdobe Flash Builder 4.7sdks4.6.0binadt"(具体地址各不同) -package -storetype PKCS12 -keystore test.p12(*.p12密钥文件,具体什么用不清楚) -storepass 123456(密钥的密码 密钥通过flashbuilder可生成设置)-target ane test.ane(ane文件名 随意) extension.xml -swc *.swc -platform Android-ARM -C Android-ARM .
打包ane基本上没有什么太多的就是比较麻烦,只要按照上面网址上的弄,基本不会出错误的。不过使用了ane的工程不能再桌面上调试了,只能在真机上调试
2.本地扩展
我在扩展中是使用android的webview来加载网站的swf
首先webview加载swf需要两个权限 一个是internet权限,使用ane的话一切有关android的权限 属性什么的都是是在工程中 -app.xml中设置.而air对于android有些权限是不支持的。具体参照官网:http://help.adobe.com/zh_CN/air/build/WSfffb011ac560372f-5d0f4f25128cc9cd0cb-7ffc.html
webview方面的知识
//去掉屏幕的标题栏 状态栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
??getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
?????????WindowManager.LayoutParams.FLAG_FULLSCREEN);
由于需要实现跳过登陆界面直接打开响应的swf,需要保存cookie,保存cookie必须要创建新线程 否则会报错。
new Thread(new Runnable() {
???????? public void run() {
???????? ?if(!bCookiesFinded)
???????? ?{
???????? ??DefaultHttpClient client = new DefaultHttpClient();
????? ???? HttpContext context = new BasicHttpContext();
????????? HttpGet get = new HttpGet("www.baidu.com“);
???????????HttpResponse response;
????? ??try {
????? ???response = client.execute(get);
????? ????if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
????? ????????????? // 根据你的逻辑,判断返回的值是不是表示已经登录成功
????? ?????bCookiesFinded = true;
????? ????? ??? CookieStore cookieStore = client.getCookieStore();
????? ????? ??? cookies = cookieStore.getCookies();?
????? ??????? }
????? ???
????? ??} catch (ClientProtocolException e) {
????? ???// TODO Auto-generated catch block
????? ???e.printStackTrace();
????? ??} catch (IOException e) {
????? ???// TODO Auto-generated catch block
????? ???e.printStackTrace();
????? ??}
???????? ?}
???????? ?else
???????? ?{
???????? ??return;
???????? ?}
???????? ?
???????? }
???? }).start();
//cookie的使用
?CookieSyncManager.createInstance(this);
??????? CookieManager cookieManager = CookieManager.getInstance();
//具体使用 具体分析大概就是这么样
?????for (int i = 0; i < cookies.size(); i++) {
??? ??String cookieString = cookies.get(i).getName() + "=" + cookies.get(i).getValue() + "; domain=" + cookies.get(i).getDomain();
??? ??cookieManager.setCookie("http://www.baidu.com",cookieString);????????????
??????? }
webview的设置
WebSettings settings = webview.getSettings();
??settings.setJavaScriptEnabled(true);???//在webview上使用js代码
??????? settings.setPluginState(PluginState.ON);
??????? settings.setUseWideViewPort(true);???//如果不能再网页上修改大小 在这设置自适应
??????? settings.setLoadWithOverviewMode(true);
??????? webview.setVerticalScrollBarEnabled(false); //不使用滚动条
??????? webview.setHorizontalScrollBarEnabled(false);
??????? settings.setCacheMode(WebSettings.LOAD_NO_CACHE); //不保留缓存
webview有白边
原因1:有滚动条 按照上述取消即可
原因2:swf的大小不匹配,只能设置webview的宽高比,不按照全屏大小设置。
?????????????? webview.setLayoutParams(new LayoutParams(??
???????????宽, 高));
?
weview使用javascript代码
在你加载完成了一个包括js代码的网页后
?String strUrl = "javascript:函数名(‘函数的参数')";
?????????? webview.loadUrl(strUrl);
webview包含一系列网络加载的检查,具体百度
webview屏蔽双击放大的功能
public boolean onTouchEvent(MotionEvent event) {
??// TODO Auto-generated method stub
?? if (event.getAction()==MotionEvent.ACTION_DOWN) {?
??????????? long currentTouchTime=System.currentTimeMillis();?
??????????? if (currentTouchTime-preTouchTime<=ViewConfiguration.getDoubleTapTimeout()) {?
??????????????? //preTouchTime = currentTouchTime;?
??????????????? return true;?
??????????? }??
??????????? preTouchTime=currentTouchTime;?
?? }
?? if(event.getAction()==MotionEvent.ACTION_UP){
??? long currentTouchTime=System.currentTimeMillis();?
??? preTouchTime = currentTouchTime;
?? }
??return super.onTouchEvent(event);
?}
ane部分就讲这些。
3.as2.0移植as3.0
as2.0到as3.0变化很多 尤其是一些函数的使用上,下面的网址是as2.0 as3.0函数对比:
http://www.dengjie.com/temp/as2as3/
4.在air中对虚拟键盘的支持
具体参看官网:
http://help.adobe.com/zh_CN/as3/dev/WSfffb011ac560372f2e63562a12dedf852e9-8000.html
5.as3.0官网api地址
http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/index.html
6.swf在浏览器中查看调试信息
使用chrome 或者火狐浏览器
代码中加入
import flash.external.ExternalInterface;
?if (ExternalInterface.available) ExternalInterface.call("console.log",调试信息);
在控制台的console中查看即可
7.查看网络连接数据
使用fiddler软件,在手机端运行的程序也可以使用,具体参看:
http://yingfangming.blog.163.com/blog/static/16580247020142215553545/
8.flash4.7软件的破解
网上的一些三步破解法存在问题,当代码更新的时候,编译出错,下面的方法绝对没有问题:
http://dong2008hong.blog.163.com/blog/static/46968827201401354238583/
9.关于swf的加载
如果a.swf加载b.swf,而还需要b加载c.swf,那么在air中(其他地方不知道)b加载c所使用的路径是c相对于a的路径而不是b。
获取加载swf中的类:
public function loadTest(sURL:String):void{
???var domain:LoaderContext= new LoaderContext(false,ApplicationDomain.currentDomain);
???domain.allowCodeImport = true;
???domain.allowLoadBytesCodeExecution = true;?
???var urlRequset:URLRequest = new URLRequest(sURL);
???urlRequset.requestHeaders = [new URLRequestHeader("Referer","http://www.baidu.com")];?//在air for android中如果要加载网络上的资源,需要修改referer属性,本地不需要?
???loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoader1Complete);
???function onLoader1Complete(e:Event):void{
//必须使用loadbytes方法进行加载才能获取到加载swf中的类
????loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,onLoader1Complete);
????var loaderinfo:LoaderInfo = e.target as LoaderInfo;
????mLoader.loadBytes(loaderinfo.bytes,mDomain);????}??}
//根据类名获取类
public static function getClass(str:String):Class
??????? {
??????????? if (ApplicationDomain.currentDomain.hasDefinition(str))
??????????? {
??????????????? return ApplicationDomain.currentDomain.getDefinition(str) as Class;
??????????? }
??????????? return null;
??????? }
10.swf间传递数据 调用函数
在air中LocalConnection是无法使用的
如果a.swf加载了b.swf。想在b中调用a的方法。在a中添加消息监听,b中发送消息
a中:
private var shared:EventDispatcher = picLoader.contentLoaderInfo.sharedEvents;
shared.addEventListener("return",onReturn);
b中:
var share:Object = this.loaderInfo;
var eventReturn:TextEvent = new TextEvent("return");
????eventReturn.text = "传递的数据";
????share.sharedEvents.dispatchEvent(eventReturn);
????return;
11.TextField的问题
遇到个问题,textfield无法输入,后来调查发现属性embedFonts设置为true,如果你没有嵌入响应的字体的话,输入的文字是不会显示的。
textField的getCharBoundaries 为null,网上有一些方法,但是都没用,具体智能谨慎使用了。
以上,暂时写到这