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"/>
评论列表: