18
2015
07

Android开发学习:读取手机SIM号码信息

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"/>

« 上一篇下一篇 »

评论列表:

1.热词网  2015/7/23 15:03:55 回复该留言
无聊之中发现贵宝地,特此留个言。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。