Android 读取SIM卡参数

时间:2024-03-07 18:06:23
 

 

  1. package com.water.activity;  
  2.   
  3. import java.util.List;  
  4.   
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.telephony.CellLocation;  
  8. import android.telephony.NeighboringCellInfo;  
  9. import android.telephony.TelephonyManager;  
  10. import android.util.Log;  
  11.   
  12. public class MyList extends Activity {  
  13.   
  14.     /** 
  15.      * android API中的TelephonyManager对象,可以取得SIM卡中的信息 
  16.      */  
  17.     private TelephonyManager telMgr;  
  18.   
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.         setContentView(R.layout.main);  
  23.   
  24.         telMgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);  
  25.   
  26.         if (telMgr.getSimState() == telMgr.SIM_STATE_READY) {  
  27.             Log.i("MyList", "良好");  
  28.         } else if (telMgr.getSimState() == telMgr.SIM_STATE_ABSENT) {  
  29.             Log.i("MyList", "无SIM卡");  
  30.         } else {  
  31.             Log.i("MyList", "SIM卡被锁定或未知的状态");  
  32.         }  
  33.   
  34.         Log.i("MyList", "电话状态[0 无活动/1 响铃/2 摘机]:" + getCallState());  
  35.         Log.i("MyList", "电话方位:" + getCellLocation());  
  36.         Log.i("MyList", "唯一的设备ID:" + getDeviceId());  
  37.         Log.i("MyList", "设备的软件版本号:" + getDeviceSoftwareVersion());  
  38.         Log.i("MyList", "手机号:" + getLine1Number());  
  39.         Log.i("MyList", "附近的电话的信息:" + getNeighboringCellInfo());  
  40.         Log.i("MyList", "获取ISO标准的国家码,即国际长途区号:" + getNetworkCountryIso());  
  41.         Log.i("MyList", "MCC+MNC:" + getNetworkOperator());  
  42.         Log.i("MyList", "(当前已注册的用户)的名字:" + getNetworkOperatorName());  
  43.         Log.i("MyList", "当前使用的网络类型:" + getNetworkType());  
  44.         Log.i("MyList", "手机类型:" + getPhoneType());  
  45.         Log.i("MyList", "SIM卡的国家码:" + getSimCountryIso());  
  46.         Log.i("MyList", "获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字:" + getSimOperator());  
  47.         Log.i("MyList", "服务商名称:" + getSimOperatorName());  
  48.         Log.i("MyList", "SIM卡的序列号:" + getSimSerialNumber());  
  49.         Log.i("MyList", "SIM的状态信息:" + getSimState());  
  50.         Log.i("MyList", "唯一的用户ID:" + getSubscriberId());  
  51.         Log.i("MyList", "取得和语音邮件相关的标签,即为识别符:" + getVoiceMailAlphaTag());  
  52.         Log.i("MyList", "获取语音邮件号码:" + getVoiceMailNumber());  
  53.         Log.i("MyList", "ICC卡是否存在:" + hasIccCard());  
  54.         Log.i("MyList", "是否漫游:" + isNetworkRoaming());  
  55.         Log.i("MyList", "获取数据活动状态:" + getDataActivity());  
  56.         Log.i("MyList", "获取数据连接状态:" + getDataState());  
  57.   
  58.         // telMgr.listen(PhoneStateListener listener, int events) ;  
  59.         // 解释:  
  60.         // IMSI是国际移动用户识别码的简称(International Mobile Subscriber Identity)  
  61.         // IMSI共有15位,其结构如下:  
  62.         // MCC+MNC+MIN  
  63.         // MCC:Mobile Country Code,移动国家码,共3位,中国为460;  
  64.         // MNC:Mobile NetworkCode,移动网络码,共2位  
  65.         // 在中国,移动的代码为电00和02,联通的代码为01,电信的代码为03  
  66.         // 合起来就是(也是Android手机中APN配置文件中的代码):  
  67.         // 中国移动:46000 46002  
  68.         // 中国联通:46001  
  69.         // 中国电信:46003  
  70.         // 举例,一个典型的IMSI号码为460030912121001  
  71.         // IMEI是International Mobile Equipment Identity (国际移动设备标识)的简称  
  72.         // IMEI由15位数字组成的”电子串号”,它与每台手机一一对应,而且该码是全世界唯一的  
  73.         // 其组成为:  
  74.         // 1. 前6位数(TAC)是”型号核准号码”,一般代表机型  
  75.         // 2. 接着的2位数(FAC)是”最后装配号”,一般代表产地  
  76.         // 3. 之后的6位数(SNR)是”串号”,一般代表生产顺序号  
  77.         // 4. 最后1位数(SP)通常是”0″,为检验码,目前暂备用  
  78.     }  
  79.   
  80.     /** 
  81.      * 电话状态:<br/> 
  82.      * CALL_STATE_IDLE 无任何状态时<br/> 
  83.      * CALL_STATE_OFFHOOK 接起电话时<br/> 
  84.      * CALL_STATE_RINGING 电话进来时 
  85.      *  
  86.      * @return 
  87.      */  
  88.     private int getCallState() {  
  89.         return telMgr.getCallState();  
  90.     }  
  91.   
  92.     /** 
  93.      * 返回当前移动终端的位置 <br/> 
  94.      *  
  95.      * @return 
  96.      */  
  97.     private CellLocation getCellLocation() {  
  98.         CellLocation location = telMgr.getCellLocation();  
  99.   
  100.         // 请求位置更新,如果更新将产生广播,接收对象为注册LISTEN_CELL_LOCATION的对象,需要的permission名称为ACCESS_COARSE_LOCATION。  
  101.         // location.requestLocationUpdate();  
  102.   
  103.         return location;  
  104.     }  
  105.   
  106.     /** 
  107.      * 唯一的设备ID:<br/> 
  108.      * 如果是GSM网络,返回IMEI;如果是CDMA网络,返回MEID<br/> 
  109.      * 需要权限:android.permission.READ_PHONE_STATE 
  110.      *  
  111.      * @return null if device ID is not available. 
  112.      */  
  113.     private String getDeviceId() {  
  114.         return telMgr.getDeviceId();  
  115.     }  
  116.   
  117.     /** 
  118.      * 返回移动终端的软件版本:<br/> 
  119.      * 例如:GSM手机的IMEI/SV码。<br/> 
  120.      *  
  121.      * @return null if the software version is not available. 
  122.      */  
  123.     private String getDeviceSoftwareVersion() {  
  124.         return telMgr.getDeviceSoftwareVersion();  
  125.     }  
  126.   
  127.     /** 
  128.      * 手机号:<br/> 
  129.      * 对于GSM网络来说即MSISDN 
  130.      *  
  131.      * @return null if it is unavailable. 
  132.      */  
  133.     private String getLine1Number() {  
  134.         return telMgr.getLine1Number();  
  135.     }  
  136.   
  137.     /** 
  138.      * 返回当前移动终端附近移动终端的信息:<br/> 
  139.      * 类型:List<NeighboringCellInfo><br/> 
  140.      * 需要权限:android.Manifest.permission#ACCESS_COARSE_UPDATES 
  141.      *  
  142.      * @return 
  143.      */  
  144.     private List<NeighboringCellInfo> getNeighboringCellInfo() {  
  145.         // List<NeighboringCellInfo> infos = telMgr.getNeighboringCellInfo();  
  146.         // for (NeighboringCellInfo info : infos) {  
  147.         // // 获取邻居小区号  
  148.         // int cid = info.getCid();  
  149.         //  
  150.         // // 获取邻居小区LAC,LAC:  
  151.         // // 位置区域码。为了确定移动台的位置,每个GSM/PLMN的覆盖区都被划分成许多位置区,LAC则用于标识不同的位置区。  
  152.         // info.getLac();  
  153.         // info.getNetworkType();  
  154.         // info.getPsc();  
  155.         //  
  156.         // // 获取邻居小区信号强度  
  157.         // info.getRssi();  
  158.         // }  
  159.   
  160.         return telMgr.getNeighboringCellInfo();  
  161.     }  
  162.   
  163.     /** 
  164.      * 获取ISO标准的国家码,即国际长途区号。<br/> 
  165.      * 注意:仅当用户已在网络注册后有效。<br/> 
  166.      * 在CDMA网络中结果也许不可靠。<br/> 
  167.      *  
  168.      * @return 
  169.      */  
  170.     private String getNetworkCountryIso() {  
  171.         return telMgr.getNetworkCountryIso();  
  172.     }  
  173.   
  174.     /** 
  175.      * MCC+MNC(mobile country code + mobile network code)<br/> 
  176.      * 注意:仅当用户已在网络注册时有效。<br/> 
  177.      * 在CDMA网络中结果也许不可靠。<br/> 
  178.      *  
  179.      * @return 
  180.      */  
  181.     private String getNetworkOperator() {  
  182.         return telMgr.getNetworkOperator();  
  183.     }  
  184.   
  185.     /** 
  186.      * 按照字母次序的current registered operator(当前已注册的用户)的名字<br/> 
  187.      * 注意:仅当用户已在网络注册时有效。<br/> 
  188.      * 在CDMA网络中结果也许不可靠。 
  189.      *  
  190.      * @return 
  191.      */  
  192.     private String getNetworkOperatorName() {  
  193.         return telMgr.getNetworkOperatorName();  
  194.     }  
  195.   
  196.     /** 
  197.      * 当前使用的网络类型:<br/> 
  198.      * NETWORK_TYPE_UNKNOWN 网络类型未知 0<br/> 
  199.      * NETWORK_TYPE_GPRS GPRS网络 1<br/> 
  200.      * NETWORK_TYPE_EDGE EDGE网络 2<br/> 
  201.      * NETWORK_TYPE_UMTS UMTS网络 3<br/> 
  202.      * NETWORK_TYPE_HSDPA HSDPA网络 8<br/> 
  203.      * NETWORK_TYPE_HSUPA HSUPA网络 9<br/> 
  204.      * NETWORK_TYPE_HSPA HSPA网络 10<br/> 
  205.      * NETWORK_TYPE_CDMA CDMA网络,IS95A 或 IS95B. 4<br/> 
  206.      * NETWORK_TYPE_EVDO_0 EVDO网络, revision 0. 5<br/> 
  207.      * NETWORK_TYPE_EVDO_A EVDO网络, revision A. 6<br/> 
  208.      * NETWORK_TYPE_1xRTT 1xRTT网络 7<br/> 
  209.      * 在中国,联通的3G为UMTS或HSDPA,移动和联通的2G为GPRS或EGDE,电信的2G为CDMA,电信的3G为EVDO<br/> 
  210.      *  
  211.      * @return 
  212.      */  
  213.     private int getNetworkType() {  
  214.         return telMgr.getNetworkType();  
  215.     }  
  216.   
  217.     /** 
  218.      * 返回移动终端的类型:<br/> 
  219.      * PHONE_TYPE_CDMA 手机制式为CDMA,电信<br/> 
  220.      * PHONE_TYPE_GSM 手机制式为GSM,移动和联通<br/> 
  221.      * PHONE_TYPE_NONE 手机制式未知<br/> 
  222.      *  
  223.      * @return 
  224.      */  
  225.     private int getPhoneType() {  
  226.         return telMgr.getPhoneType();  
  227.     }  
  228.   
  229.     /** 
  230.      * 获取ISO国家码,相当于提供SIM卡的国家码。 
  231.      *  
  232.      * @return Returns the ISO country code equivalent for the SIM provider\'s 
  233.      *         country code. 
  234.      */  
  235.     private String getSimCountryIso() {  
  236.         return telMgr.getSimCountryIso();  
  237.     }  
  238.   
  239.     /** 
  240.      * 获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字.<br/> 
  241.      * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断). 
  242.      *  
  243.      * @return Returns the MCC+MNC (mobile country code + mobile network code) 
  244.      *         of the provider of the SIM. 5 or 6 decimal digits. 
  245.      */  
  246.     private String getSimOperator() {  
  247.         return telMgr.getSimOperator();  
  248.     }  
  249.   
  250.     /** 
  251.      * 服务商名称:<br/> 
  252.      * 例如:中国移动、联通<br/> 
  253.      * SIM卡的状态必须是 SIM_STATE_READY(使用getSimState()判断). 
  254.      *  
  255.      * @return 
  256.      */  
  257.     private String getSimOperatorName() {  
  258.         return telMgr.getSimOperatorName();  
  259.     }  
  260.   
  261.     /** 
  262.      * SIM卡的序列号:<br/> 
  263.      * 需要权限:READ_PHONE_STATE 
  264.      *  
  265.      * @return 
  266.      */  
  267.     private String getSimSerialNumber() {  
  268.         return telMgr.getSimSerialNumber();  
  269.     }  
  270.   
  271.     /** 
  272.      * SIM的状态信息:<br/> 
  273.      * SIM_STATE_UNKNOWN 未知状态 0<br/> 
  274.      * SIM_STATE_ABSENT 没插卡 1<br/> 
  275.      * SIM_STATE_PIN_REQUIRED 锁定状态,需要用户的PIN码解锁 2<br/> 
  276.      * SIM_STATE_PUK_REQUIRED 锁定状态,需要用户的PUK码解锁 3<br/> 
  277.      * SIM_STATE_NETWORK_LOCKED 锁定状态,需要网络的PIN码解锁 4<br/> 
  278.      * SIM_STATE_READY 就绪状态 5 
  279.      *  
  280.      * @return 
  281.      */  
  282.     private int getSimState() {  
  283.         return telMgr.getSimState();  
  284.     }  
  285.   
  286.     /** 
  287.      * 唯一的用户ID:<br/> 
  288.      * 例如:IMSI(国际移动用户识别码) for a GSM phone.<br/> 
  289.      * 需要权限:READ_PHONE_STATE 
  290.      *  
  291.      * @return 
  292.      */  
  293.     private String getSubscriberId() {  
  294.         return telMgr.getSubscriberId();  
  295.     }  
  296.   
  297.     /** 
  298.      * 取得和语音邮件相关的标签,即为识别符<br/> 
  299.      * 需要权限:READ_PHONE_STATE 
  300.      *  
  301.      * @return 
  302.      */  
  303.     private String getVoiceMailAlphaTag() {  
  304.         return telMgr.getVoiceMailAlphaTag();  
  305.     }  
  306.   
  307.     /** 
  308.      * 获取语音邮件号码:<br/> 
  309.      * 需要权限:READ_PHONE_STATE 
  310.      *  
  311.      * @return 
  312.      */  
  313.     private String getVoiceMailNumber() {  
  314.         return telMgr.getVoiceMailNumber();  
  315.     }  
  316.   
  317.     /** 
  318.      * ICC卡是否存在 
  319.      *  
  320.      * @return 
  321.      */  
  322.     private boolean hasIccCard() {  
  323.         return telMgr.hasIccCard();  
  324.     }  
  325.   
  326.     /** 
  327.      * 是否漫游:(在GSM用途下) 
  328.      *  
  329.      * @return 
  330.      */  
  331.     private boolean isNetworkRoaming() {  
  332.         return telMgr.isNetworkRoaming();  
  333.     }  
  334.   
  335.     /** 
  336.      * 获取数据活动状态<br/> 
  337.      * DATA_ACTIVITY_IN 数据连接状态:活动,正在接受数据<br/> 
  338.      * DATA_ACTIVITY_OUT 数据连接状态:活动,正在发送数据<br/> 
  339.      * DATA_ACTIVITY_INOUT 数据连接状态:活动,正在接受和发送数据<br/> 
  340.      * DATA_ACTIVITY_NONE 数据连接状态:活动,但无数据发送和接受<br/> 
  341.      *  
  342.      * @return 
  343.      */  
  344.     private int getDataActivity() {  
  345.         return telMgr.getDataActivity();  
  346.     }  
  347.   
  348.     /** 
  349.      * 获取数据连接状态<br/> 
  350.      * DATA_CONNECTED 数据连接状态:已连接<br/> 
  351.      * DATA_CONNECTING 数据连接状态:正在连接<br/> 
  352.      * DATA_DISCONNECTED 数据连接状态:断开<br/> 
  353.      * DATA_SUSPENDED 数据连接状态:暂停<br/> 
  354.      *  
  355.      * @return 
  356.      */  
  357.     private int getDataState() {  
  358.         return telMgr.getDataState();  
  359.     }  
  360.   
  361. }