Android开发学习
Android开发中,需要读取手机号码等SIM信息。
新建布局文件:activity_main.xml,代码内容:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="left" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dip" android:layout_marginTop="15dip" android:text="" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dip" android:layout_marginTop="15dip" android:text="" /> <Button android:id="@+id/getSIMInfo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="15dip" android:layout_marginTop="15dip" android:text="获取手机号码等信息" /> </LinearLayout>
实现的MainActivity.java代码如下:
package com.zhengdecai.readsiminfo; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; /** * 读取手机号码信息 * * @author 郑德才 * */ public class MainActivity extends Activity { private Button button_getSIMInfo; private TextView number; private TextView privoid; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button_getSIMInfo = (Button) this.findViewById(R.id.getSIMInfo); number = (TextView) this.findViewById(R.id.textView1); privoid = (TextView) this.findViewById(R.id.textView2); button_getSIMInfo.setOnClickListener(new ButtonListener()); } class ButtonListener implements OnClickListener { @Override public void onClick(View v) { if (v == button_getSIMInfo) { SIMCardInfo siminfo = new SIMCardInfo(MainActivity.this); System.out.println(siminfo.getProvidersName()); System.out.println(siminfo.getNativePhoneNumber()); number.setText("手机号码:" + siminfo.getNativePhoneNumber()); privoid.setText("服务商信息:" + siminfo.getProvidersName() + "\r\n" + "SIM卡状态:" + siminfo.getSimState() + "\r\n" + "SIM卡序列号:" + siminfo.getSimSerialNumber() + "\r\n" + "SIM卡提供商代码:" + siminfo.getSimOperator() + "\r\n" + "SIM卡提供商名称:" + siminfo.getSimOperatorName() + "\r\n" + "SIM卡国别:" + siminfo.getSimCountryIso() + siminfo.getPhoneInfo()); } } } }
实现的SIMCardInfo.java代码如下:(读取手机SIM信息实体)
package com.zhengdecai.readsiminfo; import android.content.Context; import android.telephony.TelephonyManager; import android.telephony.gsm.GsmCellLocation; /** * 读取SIM卡详细信息 * * @author 郑德才 * * 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 * */ 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); } /** * 获取当前设置的电话号码 * * @author 郑德才 */ public String getNativePhoneNumber() { String NativePhoneNumber = null; NativePhoneNumber = telephonyManager.getLine1Number(); //号码未绑定到SIM卡上的无法读取到 return NativePhoneNumber; } /** * Telecom service providers获取手机服务商信息 需要加入权限<uses-permission * android:name="android.permission.READ_PHONE_STATE"/> * * @author 郑德才 */ 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; } /** * 获取当前SIM卡状态 * * @author 郑德才 */ public String getSimState() { String SimState = ""; switch (telephonyManager.getSimState()) { case TelephonyManager.SIM_STATE_READY: SimState = "良好"; break; case TelephonyManager.SIM_STATE_ABSENT: SimState = "无SIM卡"; break; default: SimState = "SIM卡被锁定或未知状态"; break; } return SimState; } /** * 获取当前SIM卡序列号 * * @author 郑德才 */ public String getSimSerialNumber() { String SimSerialNumber = null; if (telephonyManager.getSimSerialNumber() != null) SimSerialNumber = telephonyManager.getSimSerialNumber(); else SimSerialNumber = "无法取得"; return SimSerialNumber; } /** * 获取SIM卡提供商代码 * * @author 郑德才 */ public String getSimOperator() { String SimOperator = null; if (telephonyManager.getSimOperator() != null) SimOperator = telephonyManager.getSimOperator(); else SimOperator = "无法取得"; return SimOperator; } /** * 获取SIM卡提供商名称 * * @author 郑德才 */ public String getSimOperatorName() { String SimOperatorName = null; if (telephonyManager.getSimOperatorName() != null) SimOperatorName = telephonyManager.getSimOperatorName(); else SimOperatorName = "无法取得"; return SimOperatorName; } /** * 获取SIM卡国别 * * @author 郑德才 */ public String getSimCountryIso() { String SimCountryIso = null; if (telephonyManager.getSimCountryIso() != null) SimCountryIso = telephonyManager.getSimCountryIso(); else SimCountryIso = "无法取得"; return SimCountryIso; } /** * 读取SIM其他信息 * * @author 郑德才 */ public String getPhoneInfo() { StringBuilder sb = new StringBuilder(); sb.append("\r\nIMEI/MEID号 = " + (telephonyManager.getDeviceId() == null ? "无法取得" : telephonyManager.getDeviceId())); GsmCellLocation gcl = (GsmCellLocation) telephonyManager .getCellLocation(); int cid = gcl.getCid(); int lac = gcl.getLac(); sb.append("\r\n设备当前位置 = " + (telephonyManager.getCellLocation() == null ? "无法取得" : cid + "-" + lac)); sb.append("\r\n软件版本 = " + (telephonyManager.getDeviceSoftwareVersion() == null ? "无法取得" : telephonyManager.getDeviceSoftwareVersion())); sb.append("\r\n注册的网络运营商的国家代码 = " + (telephonyManager.getNetworkCountryIso() == null ? "无法取得" : telephonyManager.getNetworkCountryIso())); sb.append("\r\nMCC+跨国公司的注册网络运营商 = " + (telephonyManager.getNetworkOperator() == null ? "无法取得" : telephonyManager.getNetworkOperator())); sb.append("\r\n注册的网络运营商的名字 = " + (telephonyManager.getNetworkOperatorName() == null ? "无法取得" : telephonyManager.getNetworkOperatorName())); /* * 当前使用的网络类型: 例如: NETWORK_TYPE_UNKNOWN 网络类型未知 0 NETWORK_TYPE_GPRS GPRS网络 * 1 NETWORK_TYPE_EDGE EDGE网络 2 NETWORK_TYPE_UMTS UMTS网络 3 * NETWORK_TYPE_HSDPA HSDPA网络 8 NETWORK_TYPE_HSUPA HSUPA网络 9 * NETWORK_TYPE_HSPA HSPA网络 10 NETWORK_TYPE_CDMA CDMA网络,IS95A 或 IS95B. 4 * NETWORK_TYPE_EVDO_0 EVDO网络, revision 0. 5 NETWORK_TYPE_EVDO_A EVDO网络, * revision A. 6 NETWORK_TYPE_1xRTT 1xRTT网络 7 */ sb.append("\r\n注册的网络设备可用的类型 = " + telephonyManager.getNetworkType()); /* * 手机类型: 例如: PHONE_TYPE_NONE 无信号 PHONE_TYPE_GSM GSM信号 PHONE_TYPE_CDMA * CDMA信号 */ sb.append("\r\n设备的类型 = " + telephonyManager.getPhoneType()); sb.append("\r\n语音邮件号码 = " + (telephonyManager.getVoiceMailNumber() == null ? "无法取得" : telephonyManager.getVoiceMailNumber())); return sb.toString(); } }
需要增加读取权限:
<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
评论列表: