Android开发之获取手机SIM卡信息

jopen 6年前

      TelephonyManager是一个管理手机通话状态、电话网络信息的服务类,该类提供了大量的getXxx(),方法获取电话网络的相关信息。

TelephonyManager类概述:


    可用于访问有关设备上的电话服务信息。应用程序可以使用这个类的方法来确定电话服务和状态,以及访问某些类型的用户信息。应用程序还可以注册一个侦听器以接收的电话状态变化通知。

你不能直接实例化这个类;相反,你可以通过Context.getSystemService(Context.TELEPHONY_SERVICE)方法还获取初始化TelephonyManager实例。

需要注意的是访问某些电话信息permission-protected。。你的应用程序应该获得访问手机位置和状态的的一些权限。

TelephonyManager类提供的主要的方法:


 

Public Methods

int           

getCallState()

返回一个常数,表示设备上的呼叫状态

CellLocation           

getCellLocation()

返回设备的当前位置。

int           

getDataActivity()

返回一个常数,表示活动的数据连接的类型。

int           

getDataState()

返回一个常数表示当前数据连接状态 

String            

getDeviceId()

返回唯一的设备ID,例如,IMEI GSMMEID CDMA手机。

String           

getDeviceSoftwareVersion()

返回设备的软件版本号,例如,IMEI / SV GSM手机。

String           

getLine1Number()

返回1号线的电话号码,例如,MSISDN用于GSM电话。

List<NeighboringCellInfo>       

getNeighboringCellInfo()

返回设备的相邻小区信息。

String         

getNetworkCountryIso()

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

String           

getNetworkOperator()

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

String          

getNetworkOperatorName()

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

int          

getNetworkType()

返回一个常数,表示目前在设备上使用的无线电技术(网络类型)。

int          

getPhoneType()

返回设备的类型(手机制式)。

String          

getSimCountryIso()

 返回SIM卡运营商的国家代码

String          

getSimOperator()

返回MCC +跨国公司(移动国家代码+移动网络代码)提供者的SIM卡。

String          

getSimOperatorName()

返回服务提供者的名称(SPN)

String          

getSimSerialNumber()

返回SIM卡的序列号,如果适用的话。

int          

getSimState()

返回一个常数表示SIM卡设备的状态。

String          

getSubscriberId()

返回唯一的用户ID,例如,IMSIGSM手机。

String          

getVoiceMailAlphaTag()

检索与语音信箱号码相关的字母标识符。

String          

getVoiceMailNumber()

返回语音信箱号码。

boolean          

hasIccCard()

boolean          

isNetworkRoaming()

返回true,如果该设备被认为是漫游当前网络上,支持GSM目的。

void          

listen(PhoneStateListener listener, int events)

注册一个侦听器对象接收改变指定的电话状态的通知。

 



 应用实例:

 运行效果图:

20140722103354031.png

TelephonyStatus类:


    package com.jph.telephonystatus;                import java.util.ArrayList;        import java.util.HashMap;        import java.util.List;        import java.util.Map;        import android.os.Bundle;        import android.app.Activity;        import android.content.Context;        import android.telephony.TelephonyManager;        import android.widget.ListView;        import android.widget.SimpleAdapter;        /**        * Describe:</br>        * 获取Sim卡信息        * 本实例通过TelephonyManager类的对象的getXxx()        * 方法获取手机Sim卡信息。        * @author jph        * Date:2014.07.22         * */        public class TelephonyStatus extends Activity {            ListView listShow;            //创建一个tManager类的实例            TelephonyManager tManager;            //声明一个表示Sim卡状态名的数组            String []statusName=new String[]{};            //声明一个表示Sim卡状态值得集合            ArrayList<String>statusValue=new ArrayList<String>();            @Override            protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);                setContentView(R.layout.main);                listShow=(ListView)findViewById(R.id.listShow);                //获取系统的tManager对象                tManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);                //获取表示各种状态名的数组                statusName=getResources().getStringArray(R.array.statusName);                //获取表示sim卡状态的的数组                String simStatus[]=getResources().getStringArray(R.array.simStatus);                //获取表示手机类型的数组                String phoneType[]=getResources().getStringArray(R.array.phoneType);                //获取设备编号                statusValue.add(tManager.getDeviceId());                //获取设备类型                statusValue.add(phoneType[tManager.getPhoneType()]);                //获取软件版本                statusValue.add(tManager.getDeviceSoftwareVersion()==null?"未知"                        :tManager.getDeviceSoftwareVersion());                //获取设备当前位置                statusValue.add(tManager.getCellLocation()==null? "未知"                        :tManager.getCellLocation().toString());                //获取设备呼叫状态                switch (tManager.getCallState()) {                case TelephonyManager.CALL_STATE_IDLE:                    statusValue.add("空闲");                    break;                case TelephonyManager.CALL_STATE_OFFHOOK:                    statusValue.add("正在通话");                    break;                case TelephonyManager.CALL_STATE_RINGING:                    statusValue.add("等待接听");                    break;                default:                    break;                }                       //获取电话号码                statusValue.add(tManager.getLine1Number());                //获取运营商的国家代码                statusValue.add(tManager.getNetworkCountryIso());                //获取运营商的名称                statusValue.add(tManager.getNetworkOperatorName());                //获取网络类型                statusValue.add(getNetworkType(tManager.getNetworkType()));                 //获取SPN                statusValue.add(tManager.getSimOperatorName().equals("")?"未知"                        :tManager.getSimOperatorName());                //获取SIM卡的序列号                statusValue.add(tManager.getSimSerialNumber());                //获取SIM卡状态                statusValue.add(simStatus[tManager.getSimState()]);                List<Map<String, Object>> listItems=new ArrayList<Map<String,Object>>();                        // 遍历statusValues集合,将statusNames、statusValues                // 的数据封装到List<Map<String , String>>集合中                for (int i = 0; i < statusName.length; i++) {                    Map<String, Object>listItem=new HashMap<String, Object>();                    listItem.put("name",statusName[i]);                    listItem.put("value",statusValue.get(i));                    listItems.add(listItem);                }                SimpleAdapter adapter=new SimpleAdapter(this, listItems, R.layout.line,                        new String[]{"name","value"},new int[]{R.id.txtName,R.id.txtValue});                //为listShow设置Adapter                listShow.setAdapter(adapter);            }            //获取手机网络类型            private String getNetworkType(int networkType) {                // TODO Auto-generated method stub                      switch (networkType) {                case TelephonyManager.NETWORK_TYPE_1xRTT:                               return "1xRTT";                case TelephonyManager.NETWORK_TYPE_CDMA:                                return "CDMA";                case TelephonyManager.NETWORK_TYPE_EDGE:                                return "EDGE";                case TelephonyManager.NETWORK_TYPE_EHRPD:                               return "EHRPD";                case TelephonyManager.NETWORK_TYPE_EVDO_0:                              return "EVDO_0";                case TelephonyManager.NETWORK_TYPE_EVDO_A:                              return "EVDO_A";                case TelephonyManager.NETWORK_TYPE_EVDO_B:                              return "EVDO_B";                case TelephonyManager.NETWORK_TYPE_GPRS:                                return "GPRS";                case TelephonyManager.NETWORK_TYPE_HSDPA:                               return "HSDPA";                case TelephonyManager.NETWORK_TYPE_HSPA:                                return "HSPA";                case TelephonyManager.NETWORK_TYPE_HSPAP:                               return "HSPAP";                case TelephonyManager.NETWORK_TYPE_HSUPA:                               return "HSUPA";                case TelephonyManager.NETWORK_TYPE_IDEN:                                return "IDEN";                case TelephonyManager.NETWORK_TYPE_LTE:                             return "LTE";                case TelephonyManager.NETWORK_TYPE_UMTS:                                return "UMTS";                case TelephonyManager.NETWORK_TYPE_UNKNOWN:                             return "UNKNOWN";                default:                    return "UNKNOWN";                }                   }        }  
</div> </div> array.xml

    <?xml version="1.0" encoding="utf-8"?>        <resources>            <!-- 声明一个名为statusName的数组 -->            <string-array name="statusName">                <item>设备编号</item>                <item>手机制式</item>                <item>软件版本</item>                <item>设备当前位置</item>                <item>设备呼叫状态</item>                <item>电话号码</item>                <item>运营商的国家代码</item>                <item>运营商的名称</item>                <item>网络类型</item>                <item>SPN</item>                <item>SIM卡的序列号</item>                <item>SIM卡状态</item>            </string-array>            <!-- 声明一个名为phoneType的数组 -->            <string-array name="phoneType">                <item>未知</item>                <item>GSM</item>                <item>CDMA</item>            </string-array>            <!-- 声明一个名为simSatus的数组 -->            <string-array name="simStatus">                <item>状态未知</item>                <item>无SIM卡</item>                <item>被PIN加锁</item>                <item>被PUK加锁</item>                <item>被NetWork PIN加锁</item>                <item>已准备好</item>            </string-array>        </resources>  
</div> </div>
AndroidManifest.xml

    <!-- 添加访问手机位置的权限 -->            <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>            <!-- 添加访问手机状态的权限 -->            <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  
</div> </div> 关于TelephonyManager其它实际应用可参照:Android开发之监听手机来电</span>