作者: Sam (甄峰) sam_code@hotmail.com
在Android开发中,常需要得到Android
Device一些具体信息。如基站(Cell)信息,设备唯一ID,设备网络类型等。读取此类信息,第一个方式就是通过TelephonyManager.
0.基础知识:
TelephonyManager提供访问设备电信信息的途径和办法,应用程序可以利用它得到电信服务和状态信息。应用程序也可以Register
一个Listener去侦测电信服务和状态的变化。
不能直接实例化,而应该通过
Context.getSystemService(Context.TELEPHONY.SERVICE);获取。
1.实际使用:
1.1:获取基站信息:
1.1.1: 获取所有基站信息:
TelephonyManager tm = (TelephonyManager)
this.getSystemService(TELEPHONY_SERVICE);
List cellInfoList = tm.getAllCellInfo();
if(cellInfoList.size() > 0)
{
for(CellInfo ci: cellInfoList)
{
s = s + ci.toString() + "\n\n";
}
}
可以获取所有的基站信息。
1.1.2:获取周边基站信息:
TelephonyManager tm =
(TelephonyManager)
this.getSystemService(TELEPHONY_SERVICE);
List nclList =
tm.getNeighboringCellInfo();
if(nclList.size() >
0)
{
s = s + "Get Neigh Cell Info:
\n";
for(NeighboringCellInfo ci:
nclList)
{
s = s + ci.toString() +
"\n\n";
}
}
else
{
s = s + "No Neighboring Cell Info" +
"\n";
}
这两个方法中,比较推荐使用getAllCellInfo().
他们在一些Device下会返回null.
1.13:
利用基站获取位置信息:
CellLocation celllocation =
tm.getCellLocation();
if(celllocation !=
null)
{ s = s + celllocation.toString() + "\n";
}
1.2:获取运营商信息:
//获取网络类型:GSM/CDMA/SIP。
s = s + "Photo type:" + tm.getPhoneType() + "\n";
//短信代理商URL。Sam显示的竟然是GOOGLE的?
s = s + "MMS URL:" + tm.getMmsUAProfUrl() + "\n";
//短信代理商
s = s + "MMS Agent:" + tm.getMmsUserAgent() + "\n";
// Mobile
Country Code。 获取到的是cn.
s = s + "Network Contry ISO:" + tm.getNetworkCountryIso() +
"\n";
//MCC+MNC: 46000 (MCC+MNC
(mobile country code + mobile network
code))
s = s + "MCC+MNC:" + tm.getNetworkOperator () + "\n";
//运营商名:中国移动
s = s + "Network Operator Name:" + tm.getNetworkOperatorName
() + "\n";
//得到网路类型:
getNetworkType(); //CDMA:
Either IS95A or IS95B, UMTS, LTE等。
以上方法,在CDMA模式下有可能不适用。
1.3:获取数据网络信息:
//获取数据网路数据流向:0:表示未传输, 3,表示IN/OUT
s = s + "Data Activity:" + tm.getDataActivity() + "\n"; //0.
3
//获取数据网络装态:0. 未连接。 2:已经连接。
s = s + "Data State:" + tm.getDataState() + "\n"; //0. 2
1.4: 获取SIM卡信息:
//SIM卡状态,SIM卡正常是:SIM_STATE_READY
s = s + "SIM State:" + tm.getSimState() + "\n";
// SIM卡国家
s = s + "Country ISO:" + tm.getSimCountryIso() + "\n";
// MCC+MNC
s = s + "MCC+MNC:" + tm.getSimOperator() + "\n";
//运营商名
s = s + "Operator Name:" + tm.getSimOperatorName () +
"\n";
//SIM 卡Serial Number
s = s + "Serial Number:" + tm.getSimSerialNumber() +
"\n";
//898600560914f3016353
//电话号码:
但它经常被运营商设置的看不到。
1.5:获取IMSI和Device ID(IMEI):
s = s
+ "IMSI:" + tm.getSubscriberId() + "\n";
s = s + "DeviceID(IMEI):" + tm.getDeviceId() +
"\n";
IMSI和IMEI的区别在哪呢?
IMSI
国际移动用户识别码(IMSI:International Mobile Subscriber Identification Number)是区别移动用户的标志,储存在SIM卡中,可用于区别移动用户的有效信息。其总长度不超过15位,使用0~9的数字。
IMEI
IMEI(International Mobile
Equipment
Identity,移动设备国际识别码,又称为国际移动设备标识)是手机的唯一识别号码。IMEI俗称“手机串号”,存储在手机的EEPROM(俗称“码片”)里。
手机在生产时,就被赋予一个IMEI。IMEI由15位数字组成,每位数字仅使用0~9的数字。
IMEI是区别移动设备的标识,储存在移动设备中,可用于监控被窃或无效的移动设备。
IMEI码由GSM(Global System for Mobile
Communications,全球移动通信协会)统一分配,授权BABT(British approvals Board of
Telecommunications,英国通信认证管理委员会)审受。
很明显,IMSI是区别用户的,存储在SIM卡中,不同的SIM卡有不同的IMSI,而不同的运营商的SIM卡是不一样的,因此,通过读取用户的SIM卡中的IMSI可以区分用户使用的是哪个运营商的网络。(而wifi一般是通过IP来区分运营商和所在的地域,xG网络通过IMSI来区分)
IMEI是区别设备的,存储在手机的EEPROM中,因此IMEI常用来区分用户是否在同一手机上。