Adobe AIR3,Android本机扩展[Native Extensions]详细示例

到目前为止,我只做过Android上的本机扩展,windows, ios 上的还没有实践过

具体流程,和相关网址如下。

1. Android开发环境

参考网址:http://hi.baidu.com/lvjava/blog/item/74a8480ee120e0c67acbe10f.html

 

2.当然是安装Flash Builder 和 Adobe AIR3 SDK了。

下载网址:http://labs.adobe.com/downloads/air3.html

 

3.准备写代码了。

首先在Android开发环境里。编写要实现的Android API功能

例如我想实现启动APK安装器,这样AIR的程序,也能自动更新了。

首先将AIR SDK里的lib/android/FlashRuntimeExtensions.jar 添加到Android开发项目的类库里,因为实现扩展要用到里面的类和接口。。。[好像是废话睡觉]

 

package com.ishowtu.android;

import java.util.HashMap;
import java.util.Map;
import android.util.Log;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREExtension;
import com.adobe.fre.FREFunction;
import com.ishowtu.android.function.AlertDialogFREFunction;
import com.ishowtu.android.function.IntentFunction;

public class AS3Context extends FREContext implements FREExtension {
	
	private static final String TAG = "[AS3Context]";
	
	@Override
	public FREContext createContext(String pType) {
		log(pType);
		return new AS3Context();
	}
	@Override
	public void initialize() {
		log("initialize()");
	}

	@Override
	public void dispose() {
		log("dispose()");
	}

	@Override
	public Map<String, FREFunction> getFunctions() {
		//暴露air里能调用的函数名
		HashMap<String, FREFunction> result = new HashMap<String, FREFunction>();
		result.put("intentStart", new IntentFunction());
		result.put("alertDialog", new AlertDialogFREFunction());
		return result;
	}
	
	private void log(Object o){
		Log.i(TAG, o+"");
	}
}

然后再是IntentFunction这个类,AlertDialogFREFunction这个类是实现显示警告框的,很简单,我就没必要贴出来了

 

package com.ishowtu.android.function;

import java.io.File;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;

import com.adobe.fre.FREContext;
import com.adobe.fre.FREFunction;
import com.adobe.fre.FREInvalidObjectException;
import com.adobe.fre.FREObject;
import com.adobe.fre.FRETypeMismatchException;
import com.adobe.fre.FREWrongThreadException;

public class IntentFunction implements FREFunction {

	@Override
	public FREObject call(FREContext pContext, FREObject[] pParams) {
		try {
			Activity activity = pContext.getActivity();
			Intent intent = new Intent(Intent.ACTION_VIEW); 
			intent.setDataAndType(Uri.fromFile(new File(pParams[0].getAsString())), pParams[1].getAsString()); 
			activity.startActivity(intent); 
			return FREObject.newObject(true);
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (FRETypeMismatchException e) {
			e.printStackTrace();
		} catch (FREInvalidObjectException e) {
			e.printStackTrace();
		} catch (FREWrongThreadException e) {
			e.printStackTrace();
		}
		return null;
	}
}


 在Android项目里写好这两个类,就可以导出jar文件了,

 

 

导出jar文件后,和Android项目有关的东西,我们就告一段落了。

 

4.编写extension.xml文件

 这个文件android和windows,ios的区别主要在于

<platform name="Android-ARM">

其他两个系统的。我到目前为止也不太清楚,就不说太多,免得误导大家了

 

<extension xmlns="http://ns.adobe.com/air/extension/2.5">
<id>com.ishowtu.android</id>
<versionNumber>1.0</versionNumber>
<platforms>
	<platform name="Android-ARM">
		<applicationDeployment>
			<nativeLibrary>com.ishowtu.android.jar</nativeLibrary>
			<initializer>com.ishowtu.android.AS3Context</initializer>
			<finalizer>com.ishowtu.android.AS3Context</finalizer>
		</applicationDeployment>
	</platform>
</platforms>
</extension>

 

<id>com.ishowtu.android</id>

这个是在AIR里要用到的,扩展ID

<nativeLibrary>com.ishowtu.android.jar</nativeLibrary>

这个是先导出的jar的文件名

<initializer>com.ishowtu.android.AS3Context</initializer>

<finalizer>com.ishowtu.android.AS3Context</finalizer>

这两个就是你Android项目里,初始化类的名字

 

5.编写AIR的类库项目

注意:一定要用类库,而不要写到你程序代码里

 

package com.ishowtu.android.extensions
{
	import flash.events.EventDispatcher;
	import flash.events.StatusEvent;
	import flash.external.ExtensionContext;

	public class IntentNativeUtil extends EventDispatcher
	{
		private var context:ExtensionContext;
		
		public function IntentNativeUtil()
		{
			//根据扩展的ID获取内容
			context = ExtensionContext.createExtensionContext("com.ishowtu.android", "type");
			if(context != null)
				context.addEventListener(StatusEvent.STATUS, onStatusHandler);
		}
		
		private function onStatusHandler(e:StatusEvent):void 
		{
			dispatchEvent(e.clone());			
		}
		
		public function intentStart(fileUrl:String, fileType:String):String
		{
			//这个是在Android项目里暴露的函数名
			return call("intentStart", fileUrl, fileType) as String;
		}
		
		public function alertDialog(pTitle:String, pMessage:String):Object {
			return call("alertDialog", pTitle, pMessage);		
		}
		
		private function call(pName:String , ...args:Array):Object {			
			if (context == null){
				return null;
			}
			//执行Android项目里对应的函数
			return context.call.apply( this , [pName].concat(args) );
		}
	}
}


然后生成这个项目对应的swc文件

用winrar打开对应的swc文件,提取里面的library.swf文件

 

6.好啦,离胜利只差两步了

将extension.xml,*.swc,library.swf,*.jar 文件都放到一个目录下

执行下面的命令,并将下面的文件名换成你自己文件的名字,一定要换。不要拿来主义。不然会出错的

adt这个命令,要将AIR SDK下面的bin目录,添加到环境变量里,或者直接在命令行里切换到对应的目录下。

adt -package -target ane IntentNativeUtil.ane extension.xml -swc IntentNative.swc -platform Android-ARM library.swf com.ishowtu.android.jar

如果一切ok,就会生成一个*.ane的文件了。

 

7.只差最后一步。

将swc添加到你的AIR程序库函数目录里。

var intentNative:IntentNativeUtil=new IntentNativeUtil();
intentNative.intentStart(softUpdateContorl.updateFile.nativePath, "application/vnd.android.package-archive");


第一个参数是APK文件的路径,后面是Android里要用到的这个文件的类型。

写好代码后,再AIR项目配置文件里。添加

<extensions>
    	<extensionID>com.ishowtu.android</extensionID>
</extensions>

 

这个里面的字符串就是你刚刚在extension.xml里填写的<ID>那个节点里的内容了

 

8.不好意思。差点忘记了很重要的一步,那就是编译项目了。哈哈

用flash builder导出项目。

 

 

注意:看到这一步时,再点一次下一步,就不要在继续了。

这时你的项目目录里,应该有bin-release-temp这样一个目录,如果你继续操作,就会生成apk文件,这个目录就不存在了

但是现在的flash builder还不支持本地扩展的打包,我们需要用到命令行

adt -package -target apk-captive-runtime -storetype pkcs12 -keystore E:\key\mycert.pfx  As3ColorDesign.apk As3ColorDesign-app.xml As3ColorDesign.swf ico photo update -extdir C:\extensions

这一行命令的意思就是打包APK文件,并且将运行时也打包进去。PS:AIR3新功能

指定密钥。要生成的APK名称。要打包的配置文件。和目录。

重点是这个参数-extdir C:\extensions

就是打包扩展了。你应该把刚刚生成的ane文件放到C:\extensions目录下,当然你也可以放到别的目录。只要这个地方作对应的修改即可

运行成功后,你就可以使用AIR调用Android的API了。

从理论来讲。应该是无所不能了。



 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值