Quantcast
Channel: Sam的技术Blog
Viewing all articles
Browse latest Browse all 158

Android设备信息获取 TelephonyManager

$
0
0
作者: 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常用来区分用户是否在同一手机上。



 

Viewing all articles
Browse latest Browse all 158

Trending Articles