AIR Native Extension的使用--AIR程序中获取手机SIM卡信息

来源:互联网 发布:货到付款淘宝网商城 编辑:程序博客网 时间:2024/05/01 03:18

http://blog.csdn.net/peijiangping1989/article/details/7356950

 

经过几天的努力,终于完成了这个复杂的操作过程,在Android中获取SIM卡中的电话号码和运营商信息,见我的博客http://blog.csdn.net/peijiangping1989/article/details/7344925

首先1.我们要在Android项目中写好获取SIM卡信息的代码,

需要先导入AIR安装目录下的bin目录下android目录下的FlashRuntimeExtensions.jar文件到Android项目中。在项目下建立lib文件夹,把jar拷到该文件夹下,右键jar包build path-add to build path即可。

四个类的代码如下:

AS3COntext.java

package com.pei.air;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;}}

AS3Extension.java
  
package com.pei.air;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() {}}

SIMCardInfo.java
package com.pei.air;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.pei.air;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;}}

2.右键点击com.pei.air包,选择Export导出jar文件


选择下一步,如图:


把jar包保存到桌面这样就得到了一个air3.jar文件。

3.打开FB,新建一个Flex库项目,记得勾住Adobe AIR库,如图,我们取名叫TestKu



4.在库项目中新建包和类如下:


IntentNativeUtil.as代码  

package com.codyy.ppmeet.util{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.pei.air";//与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";}}}  

extension.xml 
<?xml version="1.0" encoding="UTF-8"?><extension xmlns="http://ns.adobe.com/air/extension/3.1">  <id>com.pei.air</id>  <versionNumber>1</versionNumber>  <platforms>    <platform name="Android-ARM">      <applicationDeployment>        <nativeLibrary>air3.jar</nativeLibrary>        <initializer>com.pei.air.AS3Extension</initializer>        <finalizer>com.pei.air.AS3Extension</finalizer>      </applicationDeployment>    </platform>  </platforms></extension>

写好代码以后,我们保存,刷新项目,然后把bin目录下的TestKu.swc文件拷出来,可以新建一个文件夹把前面的air3,jar和这个TestKu.swc放一起。

5.然后在你的Flex手机项目中的libs目录下,把TestKu.swc拷进去,这样就成功的把库引入了你的项目中了,跟java导入jar性质一样,我们可以项目中编写一个如下的界面,  

<?xml version="1.0" encoding="utf-8"?><s:View xmlns:fx="http://ns.adobe.com/mxml/2009"xmlns:s="library://ns.adobe.com/flex/spark"creationComplete="init(event)" title="主页视图"><fx:Script><![CDATA[import com.codyy.ppmeet.util.IntentNativeUtil;import mx.events.FlexEvent;private var PhoneNum:String;private var helloExt:IntentNativeUtil;protected function button1_clickHandler(event:MouseEvent):void{PhoneNum=helloExt.getPhoneNum(input01.text);label01.text=PhoneNum;}protected function init(event:FlexEvent):void{// TODO Auto-generated method stubhelloExt = new IntentNativeUtil();//创建extension}]]></fx:Script><fx:Declarations><!-- 将非可视元素(例如服务、值对象)放在此处 --></fx:Declarations><s:Button x="173" y="179" width="127" label="按钮" click="button1_clickHandler(event)"/><s:Label id="label01" x="65" y="45" width="375" height="42" text="标签"/><s:TextInput id="input01" x="122" y="117" width="237" height="42"/></s:View>

当然你也可以在类文件中使用只需调用IntentNativeUtil的getPhoneNum方法就可以。

这样所有的事情都已经解决。所有的代码都已经写好了,当然你不可以直接运行程序,因为目前AIR还不支持引用了Native Extension的打包。

请看下篇博客如何进行使用了Native Extension的AIR项目的打包。

http://blog.csdn.net/peijiangping1989/article/details/7357185

由于不能自动编译和打包,所以我们就必须手动打包,打包需要的一些文件如下:

1.air3.jar

2.TestKu.swc

3.extension.xml

4.android数字签名

前面3个文件在上个博客中都有获取的办法。下面我们来说制作android数字签名。

1.在FB 中随便选择一个Flex手机项目右键点击选择导出,也就是Export,选择Flash Build项下的发行版,如下图:


2.点击下一步,不用设置什么,继续点击下一步,出现的界面中左边选择Google Android,选择TAB为数字签名如图:】


3.选择上图的创建按钮,出现创建数字签名界面,如图:

这样就得到了一个love.p12的数字证书文件。4个文件已经OK了,进入下一步

4,在桌面在新建一个文件夹ane,里面的内容如下:


5.拷贝文件TestKu.swc在桌面。修改名称为TestKu.zip.解压获取到2个文件,里面有一个library.swf和catalog,xml文件。

6,将library.swf和catalog.xml拷贝到ane文件中的Android-ARM文件夹下,Android-ARM文件夹内容如下:

7.然后找到AIR的安装目录的如下,我这里是D:\AiR\AIRSDK\bin,也可以是FB的安装目录下的,我这里是F:\FB\Adobe Flash Builder 4.6\sdks\4.6.0\bin

都可以,只要目录下有adt.bat.然后打开,cmd目录锁定在C:\Documents and Settings\Administrator\桌面\ane目录。这个会吧。。cd C:\Documents and Settings\Administrator\桌面\ane就可以了。然后输入

"D:\AiR\AIRSDK\bin\adt" -package -storetype PKCS12 -keystore love.p12 -storepass 6527885 -target ane com.pei.air.ane extension.xml -swc *.swc -platform Android-ARM -C Android-ARM .

"D:\AiR\AIRSDK\bin\adt"你可以换成FB目录的,-storepass 6527885证书的密码哦。上面的命令可以安装你的文件名进行修改。

完成了命令后在C:\Documents and Settings\Administrator\桌面\ane目录下可以得到com.pei.air.ane文件。

8.在桌面上新建apk文件夹,里面的内容如下图:


TestNative.swf和TestNative-app.xml文件可以到你的Flex手机项目的bin-debug目录下拷过来,这2个文件都会自动生成的哦

一切都OK了,最后一步:

9.在cmd下,目录锁定为C:\Documents and Settings\Administrator\桌面\apk,然后输入命令

"D:\AiR\AIRSDK\bin\adt" -package -target apk -storetype PKCS12 -keystore love.p12 -storepass 6527885 Testnative.apk TestNative-app.xml TestNative.swf -extdir .

Ok,这样在C:\Documents and Settings\Administrator\桌面\apk目录下就生成了APK文件,可以安装到手机中了。

过程比较繁琐,但是不复杂,需要同学们细心。

最后来一张效果图:如下


 

原创粉丝点击