MTK Android 读取SIM卡参数,获取sim卡运营商信息

    1. android 获取sim卡运营商信息(转)

       

      TelephonyManager tm = (TelephonyManager)Context.getSystemService(Context.TELEPHONY_SERVICE);

      注意:一些电话信息需要相应的权限。

      // 获取服务提供商名字,比如电信,联通,移动用下面的方法第一种方法: 获取手机的IMSI码,并判断是中国移动\中国联通\中国电信

      getSimOperatorName()  //Returns the Service Provider Name (SPN).

      IMSI 国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志, 储存在SIM卡中,可用于区别移动用户的有效信息。

      IMSI由MCC、MNC、MSIN组成,

      其中MCC为移动国家号码,由3位数字组成 // 唯一地识别移动客户所属的国家,我国为460;

      MNC为网络id,由2位数字组成// 用于识别移动客户所归属的移动网络,中国移动为00,中国联通为01,中国电信为03;

      MSIN为移动客户识别码,采用等长11位数字构成 //唯一地识别国内GSM移动通信网中移动客户。

      可以看出IMSI在MIN号码前加了MCC,可以区别出每个用户的来自的国家,因此可以实现国际漫游。

      在同一个国家内,如果有多个CDMA运营商,可以通过MNC来进行区别.

      所以要区分是移动还是联通,只需取得SIM卡中的MNC字段即可

      复制代码
      复制代码
      String imsi = telManager.getSubscriberId();

      if(imsi!=null){

      if(imsi.startsWith(“46000″) || imsi.startsWith(“46002″))

      {

      //因为移动网络编号46000下的IMSI已经用完,所以虚拟了一个46002编号,134/159号段使用了此编号 //中国移动

      }else if(imsi.startsWith(“46001″)){

      //中国联通

      }else if(imsi.startsWith(“46003″)){

      //中国电信

      }

      }
      复制代码
      复制代码

      第二种方法

      复制代码
      复制代码
      TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

      String operator = telManager.getSimOperator();

      if(operator!=null){

      if(operator.equals(“46000″) || operator.equals(“46002″)|| operator.equals(“46007″)){

      //中国移动

      }else if(operator.equals(“46001″)){

      //中国联通

      }else if(operator.equals(“46003″)){

      //中国电信

      }

      }
      复制代码
      复制代码

      在文件AndroidManifest.xml中添加权限其他方法具体使用方法请查看API 文档TelephonyManager中方法说明。

      在文件 AndroidManifest.xml 中添加权限 <uses-permission android:name= "android.permission.READ_PHONE_STATE"/>

      功能 说明

      getCellLocation() 返回的单元格位置的装置 ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION

      getDeviceId() 返回的IMEI / MEID的设备。 如果该设备是GSM设备然后IMEI号将被退回,如果该设备是一个CDMA设备然后MEID 将被退回 READ_PHONE_STATE

      getLine1Number() 返回设备的电话号码(MSISDN号码) READ_PHONE_STATE

      getNetworkOperatorName() 返回注册的网络运营商的名字

      getNetworkOperator() 返回的MCC +跨国公司的注册网络运营商

      getNetworkCountryIso() 返回注册的网络运营商的国家代码

      getSimCountryIso() 返回SIM卡运营商的国家代码 READ_PHONE_STATE

      getSimOperator() 返回SIM卡运营商的单个核细胞数+冶 READ_PHONE_STATE

      getSimOperatorName() 返回SIM卡运营商的名字 READ_PHONE_STATE

      getSimSerialNumber() 返回SIM卡的序列号 READ_PHONE_STATE

      getNetworkType() 返回网络设备可用的类型。 这将是下列其中一个值:

      TelephonyManager.NETWORK_TYPE_UNKNOWN

      TelephonyManager.NETWORK_TYPE_GPRS

      TelephonyManager.NETWORK_TYPE_EDGE

      TelephonyManager.NETWORK_TYPE_UMTS READ_PHONE_STATE

      getPhoneType() 返回设备的类型。

      这将是以下值之一:

      TelephonyManager.PHONE_TYPE_NONE

      TelephonyManager.PHONE_TYPE_GSM

      TelephonyManager.PHONE_TYPE_CDMA READ_PHONE_STATE

      getSubscriberId() 返回用户识别码(的IMSI)的设备 READ_PHONE_STATE

      getNeighboringCellInfo() 返回NeighboringCellInfo类代表名单相邻小区的信息,如果可用,否则将返回null ACCESS_COARSE_UPDATES

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

posted on 2016-08-10 12:15  相伴流年  阅读(1619)  评论(0编辑  收藏  举报

导航