守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 1164|回复: 1

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

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51691
    钢镚
    1422

    开源英雄守望者

    发表于 2015-8-4 17:26:26 | 显示全部楼层 |阅读模式
    AIR Native Extension的使用--AIR程序中获取手机SIM卡信息01

    经过几天的努力,终于完成了这个复杂的操作过程,在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

    1. package com.pei.air;  
    2.   
    3. import java.util.HashMap;  
    4. import java.util.Map;  
    5.   
    6. import com.adobe.fre.FREContext;  
    7. import com.adobe.fre.FREFunction;  
    8.   
    9. /**
    10. * class name:AS3Context<BR>
    11. * class description:<BR>
    12. * PS: <BR>
    13. * Date:2012-3-13<BR>
    14. *  
    15. * @version 1.00
    16. * @author CODYY)peijiangping
    17. */  
    18. public class AS3Context extends FREContext {  
    19.   
    20.     @Override  
    21.     public void dispose() {  
    22.     }  
    23.   
    24.     @Override  
    25.     public Map<String, FREFunction> getFunctions() {  
    26.         // 暴露air里能调用的函数名,getPhoneNum在AIR中可以使用,对应的类是AS3Function  
    27.         HashMap<String, FREFunction> hashmap = new HashMap<String, FREFunction>();  
    28.         hashmap.put("getPhoneNum", new AS3Function());  
    29.         return hashmap;  
    30.     }  
    31. }
    复制代码
    AS3Extension.java
    1. package com.pei.air;  
    2.   
    3. import com.adobe.fre.FREContext;  
    4. import com.adobe.fre.FREExtension;  
    5.   
    6. /**
    7. * class name:AS3Extension<BR>
    8. * class description:接口类和AIR程序对接<BR>
    9. * PS: <BR>
    10. * Date:2012-3-15<BR>
    11. *  
    12. * @version 1.00
    13. * @author CODYY)peijiangping
    14. */  
    15. public class AS3Extension implements FREExtension {  
    16.   
    17.     @Override  
    18.     public FREContext createContext(String arg0) {  
    19.         return new AS3Context();  
    20.     }  
    21.   
    22.     @Override  
    23.     public void dispose() {  
    24.          
    25.     }  
    26.   
    27.     @Override  
    28.     public void initialize() {  
    29.          
    30.     }  
    31.   
    32. }  
    复制代码
    SIMCardInfo.java
    1. package com.pei.air;  
    2.   
    3. import android.content.Context;  
    4. import android.telephony.TelephonyManager;  
    5.   
    6. /**
    7. * class name:SIMCardInfo<BR>
    8. * class description:读取Sim卡信息<BR>
    9. * PS: 必须在加入各种权限 <BR>
    10. * Date:2012-3-12<BR>
    11. *  
    12. * @version 1.00
    13. * @author CODYY)peijiangping
    14. */  
    15. public class SIMCardInfo {  
    16.     /**
    17.      * TelephonyManager提供设备上获取通讯服务信息的入口。 应用程序可以使用这个类方法确定的电信服务商和国家 以及某些类型的用户访问信息。
    18.      * 应用程序也可以注册一个监听器到电话收状态的变化。不需要直接实例化这个类
    19.      * 使用Context.getSystemService(Context.TELEPHONY_SERVICE)来获取这个类的实例。
    20.      */  
    21.     private TelephonyManager telephonyManager;  
    22.     /**
    23.      * 国际移动用户识别码
    24.      */  
    25.     private String IMSI;  
    26.   
    27.     public SIMCardInfo(Context context) {  
    28.         telephonyManager = (TelephonyManager) context  
    29.                 .getSystemService(Context.TELEPHONY_SERVICE);  
    30.     }  
    31.   
    32.     /**
    33.      * Role:获取当前设置的电话号码 <BR>
    34.      * Date:2012-3-12 <BR>
    35.      *  
    36.      * @author CODYY)peijiangping
    37.      */  
    38.     public String getNativePhoneNumber() {  
    39.         String NativePhoneNumber = null;  
    40.         NativePhoneNumber = telephonyManager.getLine1Number();  
    41.         return NativePhoneNumber;  
    42.     }  
    43.   
    44.     /**
    45.      * Role:Telecom service providers获取手机服务商信息 <BR>
    46.      * 需要加入权限<uses-permission
    47.      * android:name="android.permission.READ_PHONE_STATE"/> <BR>
    48.      * Date:2012-3-12 <BR>
    49.      *  
    50.      * @author CODYY)peijiangping
    51.      */  
    52.     public String getProvidersName() {  
    53.         String ProvidersName = null;  
    54.         // 返回唯一的用户ID;就是这张卡的编号神马的  
    55.         IMSI = telephonyManager.getSubscriberId();  
    56.         // IMSI号前面3位460是国家,紧接着后面2位00 02是中国移动,01是中国联通,03是中国电信。  
    57.         System.out.println(IMSI);  
    58.         if (IMSI.startsWith("46000") || IMSI.startsWith("46002")) {  
    59.             ProvidersName = "中国移动";  
    60.         } else if (IMSI.startsWith("46001")) {  
    61.             ProvidersName = "中国联通";  
    62.         } else if (IMSI.startsWith("46003")) {  
    63.             ProvidersName = "中国电信";  
    64.         }  
    65.         return ProvidersName;  
    66.     }  
    67. }  
    复制代码
    AS3Function.java
    1. package com.pei.air;  
    2.   
    3. import com.adobe.fre.FREContext;  
    4. import com.adobe.fre.FREFunction;  
    5. import com.adobe.fre.FREObject;  
    6.   
    7. import android.content.Context;  
    8.   
    9. /**
    10. * class name:AS3Function<BR>
    11. * class description:在这里的call方法里面写调用java和android接口的代码<BR>
    12. * PS: <BR>
    13. * Date:2012-3-15<BR>
    14. * @version 1.00
    15. * @author CODYY)peijiangping
    16. */  
    17. public class AS3Function implements FREFunction {  
    18.   
    19.     @Override  
    20.     public FREObject call(FREContext pContext, FREObject[] pParams) {  
    21.         try {  
    22.             Context context = pContext.getActivity();//用来取得AIR程序中的Context对象  
    23. //          Intent intent = new Intent(Intent.ACTION_VIEW);  
    24.             SIMCardInfo siminfo = new SIMCardInfo(context);  
    25.             //pParams为AIR传进来的参数组可以通过pParams[index].getXX()来获取;  
    26.             String ok = siminfo.getNativePhoneNumber()+pParams[0].getAsString()+siminfo.getProvidersName();  
    27. //          String ok ="AAAAA"+pParams[0].getAsString();  
    28. //          activity.startActivity(intent);  
    29.             return FREObject.newObject(ok);//返回一个Object对象给AIR  
    30.         } catch (Exception e) {  
    31.             e.printStackTrace();  
    32.         }  
    33.         return null;  
    34.     }  
    35.   
    36. }
    复制代码
    2.右键点击com.pei.air包,选择Export导出jar文件

    选择下一步,如图:

    把jar包保存到桌面这样就得到了一个air3.jar文件。3.打开FB,新建一个Flex库项目,记得勾住Adobe AIR库,如图,我们取名叫TestKu

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

    IntentNativeUtil.as代码
    1. package com.codyy.ppmeet.util  
    2. {  
    3.     import flash.events.EventDispatcher;  
    4.     import flash.events.StatusEvent;  
    5.     import flash.external.ExtensionContext;  
    6.   
    7.     public class IntentNativeUtil extends EventDispatcher   
    8.     {   
    9.         private var context:ExtensionContext;   
    10.          
    11.         public static const HELLO_WORLD_FUNCTION:String = "getPhoneNum";//与java端中Map里的key一致  
    12.         public static const EXTENSION_ID:String = "com.pei.air";//与extension.xml中的id标签一致  
    13.         private var extContext:ExtensionContext;  
    14.         public function IntentNativeUtil()  
    15.         {  
    16.             extContext = ExtensionContext.createExtensionContext(EXTENSION_ID,"");  
    17.             //第二个为参数,会传入java代码中的FREExtension的createContext方法  
    18.         }  
    19.         public function getPhoneNum(name:String):String{  
    20.             if(extContext){  
    21.                 return extContext.call(HELLO_WORLD_FUNCTION,name) as String;  
    22.             }  
    23.             return "failed";  
    24.         }  
    25.     }  
    26. }   
    复制代码
    extension.xml
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <extension xmlns="http://ns.adobe.com/air/extension/3.1">  
    3.   <id>com.pei.air</id>  
    4.   <versionNumber>1</versionNumber>  
    5.   <platforms>  
    6.     <platform name="Android-ARM">  
    7.       <applicationDeployment>  
    8.         <nativeLibrary>air3.jar</nativeLibrary>  
    9.         <initializer>com.pei.air.AS3Extension</initializer>  
    10.         <finalizer>com.pei.air.AS3Extension</finalizer>  
    11.       </applicationDeployment>  
    12.     </platform>  
    13.   </platforms>  
    14. </extension>  
    复制代码
    写好代码以后,我们保存,刷新项目,然后把bin目录下的TestKu.swc文件拷出来,可以新建一个文件夹把前面的air3,jar和这个TestKu.swc放一起。5.然后在你的Flex手机项目中的libs目录下,把TestKu.swc拷进去,这样就成功的把库引入了你的项目中了,跟java导入jar性质一样,我们可以项目中编写一个如下的界面,
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <s:View xmlns:fx="http://ns.adobe.com/mxml/2009"  
    3.         xmlns:s="library://ns.adobe.com/flex/spark"  
    4.         creationComplete="init(event)" title="主页视图">  
    5.       
    6.     <fx:Script>  
    7.         <![CDATA[
    8.             import com.codyy.ppmeet.util.IntentNativeUtil;
    9.             
    10.             import mx.events.FlexEvent;
    11.             private var PhoneNum:String;
    12.             private var helloExt:IntentNativeUtil;
    13.             protected function button1_clickHandler(event:MouseEvent):void
    14.             {   
    15.                 PhoneNum=helloExt.getPhoneNum(input01.text);
    16.                 label01.text=PhoneNum;
    17.             }
    18.             protected function init(event:FlexEvent):void
    19.             {
    20.                 // TODO Auto-generated method stub
    21.                 helloExt = new IntentNativeUtil();//创建extension
    22.                  
    23.             }
    24.         ]]>  
    25.     </fx:Script>  
    26.       
    27.     <fx:Declarations>  
    28.         <!-- 将非可视元素(例如服务、值对象)放在此处 -->  
    29.     </fx:Declarations>  
    30.     <s:Button x="173" y="179" width="127" label="按钮" click="button1_clickHandler(event)"/>  
    31.     <s:Label id="label01" x="65" y="45" width="375" height="42" text="标签"/>  
    32.     <s:TextInput id="input01" x="122" y="117" width="237" height="42"/>  
    33. </s:View>  
    复制代码
    当然你也可以在类文件中使用只需调用IntentNativeUtil的getPhoneNum方法就可以。这样所有的事情都已经解决。所有的代码都已经写好了,当然你不可以直接运行程序,因为目前AIR还不支持引用了Native Extension的打包。请看下篇博客如何进行使用了Native Extension的AIR项目的打包。

    本文来自:http://blog.csdn.net/peijiangping1989/article/details/7356950


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51691
    钢镚
    1422

    开源英雄守望者

     楼主| 发表于 2015-8-4 17:35:38 | 显示全部楼层

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

    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文件,可以安装到手机中了。过程比较繁琐,但是不复杂,需要同学们细心。最后来一张效果图:如下


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    守望者AIR技术交流社区(www.airmyth.com)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-8-19 01:49 , Processed in 0.044678 second(s), 37 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表