AIR Native Extension的使用(Android)一 : 打包ane

准备工作

开始之前确保以下软件都已经安装:

  • Flash Builder 4.6
  • Adobe AIR 3(Flahs builder中已经包含)
  • Adobe Flex 4.6 (Flahs builder中已经包含)
  • Java API for AS extensions(Flahs builder中已经包含 AIR 3 SDK,路径:${FB_HOME}\sdks\4.6.0\lib\android\lashRuntimeExtensions.jar)


1. 新建android项目,加入FlashRuntimeExtensions.jar

2.创建java类:


SIMCardInfo.java

package com.yj.flash.extension.android;import android.content.Context;import android.telephony.TelephonyManager;/** * class name:SIMCardInfo<BR> * class description:读取Sim卡信息<BR> * PS: 必须在加入各种权限 <BR> * Date:2012-3-12<BR> *  * @version 1.00 * @author CODYY)peijiangping */public class SIMCardInfo {/** * TelephonyManager提供设备上获取通讯服务信息的入口。 应用程序可以使用这个类方法确定的电信服务商和国家 以及某些类型的用户访问信息。 * 应用程序也可以注册一个监听器到电话收状态的变化。不需要直接实例化这个类 * 使用Context.getSystemService(Context.TELEPHONY_SERVICE)来获取这个类的实例。 */private TelephonyManager telephonyManager;/** * 国际移动用户识别码 */private String IMSI;public SIMCardInfo(Context context) {telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);}/** * Role:获取当前设置的电话号码 <BR> * Date:2012-3-12 <BR> *  * @author CODYY)peijiangping */public String getNativePhoneNumber() {String NativePhoneNumber = null;NativePhoneNumber = telephonyManager.getLine1Number();return NativePhoneNumber;}/** * Role:Telecom service providers获取手机服务商信息 <BR> * 需要加入权限<uses-permission * android:name="android.permission.READ_PHONE_STATE"/> <BR> * Date:2012-3-12 <BR> *  * @author CODYY)peijiangping */public String getProvidersName() {String ProvidersName = null;// 返回唯一的用户ID;就是这张卡的编号神马的IMSI = telephonyManager.getSubscriberId();// IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信。System.out.println(IMSI);if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) {ProvidersName = "中国移动";} else if (IMSI.startsWith("46001")) {ProvidersName = "中国联通";} else if (IMSI.startsWith("46003")) {ProvidersName = "中国电信";}return ProvidersName;}}


AS3Function.java

package com.yj.flash.extension.android;import com.adobe.fre.FREContext;import com.adobe.fre.FREFunction;import com.adobe.fre.FREObject;import android.content.Context;/** * class name:AS3Function<BR> * class description:在这里的call方法里面写调用java和android接口的代码<BR> * PS: <BR> * Date:2012-3-15<BR> *  * @version 1.00 * @author CODYY)peijiangping */public class AS3Function implements FREFunction {@Overridepublic FREObject call(FREContext pContext, FREObject[] pParams) {try {Context context = pContext.getActivity();// 用来取得AIR程序中的Context对象// Intent intent = new Intent(Intent.ACTION_VIEW);SIMCardInfo siminfo = new SIMCardInfo(context);// pParams为AIR传进来的参数组可以通过pParams[index].getXX()来获取;String ok = siminfo.getNativePhoneNumber()+ pParams[0].getAsString() + siminfo.getProvidersName();// String ok ="AAAAA"+pParams[0].getAsString();// activity.startActivity(intent);return FREObject.newObject(ok);// 返回一个Object对象给AIR} catch (Exception e) {e.printStackTrace();}return null;}}


AS3Extension.java

package com.yj.flash.extension.android;import com.adobe.fre.FREContext;import com.adobe.fre.FREExtension;/** * class name:AS3Extension<BR> * class description:接口类和AIR程序对接<BR> * PS: <BR> * Date:2012-3-15<BR> *  * @version 1.00 * @author CODYY)peijiangping */public class AS3Extension implements FREExtension {@Overridepublic FREContext createContext(String arg0) {return new AS3Context();}@Overridepublic void dispose() {}@Overridepublic void initialize() {}}


AS3Context.java

package com.yj.flash.extension.android;import java.util.HashMap;import java.util.Map;import com.adobe.fre.FREContext;import com.adobe.fre.FREFunction;/** * class name:AS3Context<BR> * class description:<BR> * PS: <BR> * Date:2012-3-13<BR> *  * @version 1.00 * @author CODYY)peijiangping */public class AS3Context extends FREContext {@Overridepublic void dispose() {}@Overridepublic Map<String, FREFunction> getFunctions() {// 暴露air里能调用的函数名,getPhoneNum在AIR中可以使用,对应的类是AS3FunctionHashMap<String, FREFunction> hashmap = new HashMap<String, FREFunction>();hashmap.put("getPhoneNum", new AS3Function());return hashmap;}}


3.export jar包

以上是java代码,以下Flash端代码:

4.创建flex库项目

创建flex库项目时选上包括air库

5.创建as类

IntentNativeUtil.as:

package com.yj.flash.extension.android{import flash.events.EventDispatcher;import flash.events.StatusEvent;import flash.external.ExtensionContext;public class IntentNativeUtil extends EventDispatcher  {  private var context:ExtensionContext;  public static const HELLO_WORLD_FUNCTION:String = "getPhoneNum";//与java端中Map里的key一致public static const EXTENSION_ID:String = "com.yj.flash.extension.android";//与extension.xml中的id标签一致private var extContext:ExtensionContext;public function IntentNativeUtil(){extContext = ExtensionContext.createExtensionContext(EXTENSION_ID,"");//第二个为参数,会传入java代码中的FREExtension的createContext方法}public function getPhoneNum(name:String):String{if(extContext){return extContext.call(HELLO_WORLD_FUNCTION,name) as String;}return "failed";}}}


6.打包ane

参考http://sswilliam.blog.163.com/blog/static/1896963832011910111931102/

需要注意的是打包命令应该是:


F:\ane>adt -package -storetype PKCS12 -keystore cert.p12 -storepass 123456 -targ
et ane com.yj.flash.extension.android.ane extension.xml -swc *.swc -platform And
roid-ARM -C Android-ARM .

命令最后加上 .