安卓手机修改imei的IMEI 码 和SN序列号,如何修改,求大神解答,

关于android读取用户号码,手机串号,SIM卡序列号
1.从一个错误代码引出我们的讨论:android公开的API提供了访问方法,大家都知道使用TelephonyManager提供的方法,但是有些理解有误,如下国内一个比较大的andorid论坛提供的例子,就出现了错误:帖子如下/thread-.html,其中实现代码没有注释,只能按照变量定义判断:&&&&&&& TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);&&&&&&& String deviceid = tm.getDeviceId(); &&&&&&& String tel = tm.getLine1Number();&&&& //取出用户手机号码,我加的&&&&&&& String imei =tm.getSimSerialNumber();& //取出IMEI,我加的&&&&&&& String imsi =tm.getSubscriberId();&&&& //取出IMSI,我加的那么上述出现错误了:String imei =tm.getSimSerialNumber();& //取出IMEIIMEI是手机的序列号,怎么会通过getSimSerialNumber()方法获得,那么查一下andorid源码可以看出:/android/mydroid/frameworks/base/telephony/java/android/telephony/TelephonyManager.java从注释里明显看出来这个函数是取SIM卡序列号的,也就是ICCID的,他用错了。
* Returns the serial number of the SIM, if applicable.
* Requires Permission:
{ android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
public String getSimSerialNumber() {
return getSubscriberInfo().getSimSerialNumber();
} catch (RemoteException ex) {
return null;
}2.相关几个定义、说明:我们说到的和手机、卡相关的号码数据包括IMSI,MSISDN,ICCID,IMEIIMSI:international mobiles subscriber identity国际移动用户号码标识,这个一般大家是不知道,GSM必须写在卡内相关文件中;MSISDN:mobile subscriber ISDN用户号码,这个是我们说的139,136那个号码;ICCID:ICC identity集成电路卡标识,这个是唯一标识一张卡片物理号码的;IMEI:international mobile Equipment identity手机唯一标识码;3.那好我们看看andorid实现TelephonyManager.java的源码:
getDeviceId()取IMEI号没有争议了。
& &&&* Returns the unique device ID, for example,the IMEI for GSM
& &&&* phones.
& &&&* &p&Requires Permission:
& &&&*& &{ android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
& & public String getDeviceId() {
& && &&&try {
& && && && &return getSubscriberInfo().getDeviceId();
& && &&&} catch (RemoteException ex) {
getLine1Number()取MSISDN,这个需要说明两点,1为什么这个函数叫getLine1Number(),因为andorid实现的时候应该分为GSM和CDMA的,GSM手机使用这个函数,CDMA应该还会由其它实现的。
2取MSISDN具体的方法就会导致最后能否取到了,函数中调用了getSubscriberInfo().getLine1Number()去实现,我们下面找找看。
& &&&* Returns the phone number string for line 1, for example, the MSISDN
& &&&* for a GSM phone.
& &&&* &p&
& &&&* Requires Permission:
& &&&*& &{ android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
& & public String getLine1Number() {
& && &&&try {
& && && && &return getSubscriberInfo().getLine1Number();
& && &&&} catch (RemoteException ex) {
找到了private IPhoneSubInfo getSubscriberInfo() {
& && &&&// get it each time because that process crashes a lot
& && &&&return IPhoneSubInfo.Stub.asInterface(ServiceManager.getService("iphonesubinfo"));
一个接口,再找有一个PhoneSubInfo.java:
& &&&* Retrieves the unique device ID, e.g., IMEI for GSM phones and MEID for CDMA phones.
& & public String getDeviceId() {
& && &&&mContext.enforceCallingOrSelfPermission(READ_PHONE_STATE, "Requires READ_PHONE_STATE");
& && &&&return mPhone.getDeviceId();
前面定义了Phone mPhone,再找Phone.java:
& &&&* Retrieves the unique sbuscriber ID, e.g., IMSI for GSM phones.
& & String getSubscriberId();
原来是个接口,发现PhoneProxy.java有具体实现& &
public String getSubscriberId() {
& && &&&return mActivePhone.getSubscriberId();
这个mActivePhone是phone的实例,我疯了,于是发现GSMPHONE。java中有了具体实现:
& &public String getSubscriberId() {
& && &&&return mSIMRecords.
& & public String getIccSerialNumber() {
& && &&&return mSIMRecords.
& & public String getLine1Number() {
& && &&&return mSIMRecords.getMsisdnNumber();
从上面看出来,应该是通过SIM卡相关文件记录得到的上述数据,从其中看到:
public void handleMessage(Message msg) 这个函数进行了真正的处理,重点看:
case EVENT_GET_MSISDN_DONE:
& && && && && & isRecordLoadResponse =
& && && && && & ar = (AsyncResult)msg.
& && && && && & if (ar.exception != null) {
& && && && && && &&&Log.d(LOG_TAG, "Invalid or missing EF[MSISDN]");& &//应该是从sim卡的EFmsisdn文件中取出来的
& && && && && && &&&
& && && && && & }
& && && && && & adn = (AdnRecord)ar.
& && && && && & msisdn = adn.getNumber();
& && && && && & msisdnTag = adn.getAlphaTag();
& && && && && & Log.d(LOG_TAG, "MSISDN: " + msisdn);
& && && && &
下面的细节就不分析了,那个问题就归结到是否可以从SIM卡的EFmsisdn文件取出手机号码了,不幸的是一般运营商不会把用户号码写在这个文件的,为什么呢?
因为这个手机号码是在用户买到卡并开通时才将IMSI和MSISDN对应上的,卡内生产出来时只有IMSI,你不知道用户喜欢那个手机号码,因此一般不先对应IMSI和MSISDN,即时有对应也不写这个文件的。4.总结一下:TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
&&&&&&& String imei = tm.getDeviceId();&&&&&& //取出IMEI
&&&&&&& String tel = tm.getLine1Number();&&&& //取出MSISDN,很可能为空
&&&&&&& String imei =tm.getSimSerialNumber();& //取出ICCID
&&&&&&& String imsi =tm.getSubscriberId();&&&& //取出IMSI 权限:公开&&&来自:labs
本文仅代表作者个人观点。其原创性及文中表达的意见、判断、数据、观点和陈述文字等内容均与中国移动研究院无关。移动Labs博客致力于为ICT领域的研究者及从业者提供技术和业务交流的网络平台,对本文中全部或部分内容的真实性、完整性不作任何保证或承诺,仅供读者参考交流。
阅读全文: | 转发(0) | 评论
Labs推荐给你的相关资讯
看过此博文的还看过
总访问量:
京公网安备 |
中国移动通信研究院版权所有// 获取IMSIpublicvoidgetIMSI(Context context) {
TelephonyManager telManager = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
String imsi = telManager.getSubscriberId();
setIMSI(imsi);
// 获取IMEIpublicvoidgetIMEI(Context context) {
String imei = ((TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
setIMEI(imei);
// 在WiFi状态下获取IP的地址publicvoidgetWifi2Ip(Context context) {
// 获取wifi服务
WifiManager wifiManager = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
// 判断wifi是否开启if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ip = intToIp(ipAddress);
// GPRS本地网络时获取的IP地址publicvoidgetLocalIpAddress() {
for (Enumeration&NetworkInterface& en = NetworkInterface
.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration&InetAddress& enumIpAddr = intf
.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
} catch (Socket ex) {
* 得到当前的手机网络类型
* @param context
*/public String getCurrentNetType(Context context) {
String type = "";
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getActiveNetworkInfo();
if (info == null) {
type = "null";
} elseif (info.getType() == ConnectivityManager.TYPE_WIFI) {
type = "wifi";
} elseif (info.getType() == ConnectivityManager.TYPE_MOBILE) {
int subType = info.getSubtype();
if (subType == TelephonyManager.NETWORK_TYPE_CDMA
|| subType == TelephonyManager.NETWORK_TYPE_GPRS
|| subType == TelephonyManager.NETWORK_TYPE_EDGE) {
type = "2g";
} elseif (subType == TelephonyManager.NETWORK_TYPE_UMTS
|| subType == TelephonyManager.NETWORK_TYPE_HSDPA
|| subType == TelephonyManager.NETWORK_TYPE_EVDO_A
|| subType == TelephonyManager.NETWORK_TYPE_EVDO_0
|| subType == TelephonyManager.NETWORK_TYPE_EVDO_B) {
type = "3g";
} elseif (subType == TelephonyManager.NETWORK_TYPE_LTE) {// LTE是3g到4g的过渡,是3.9G的全球标准
type = "4g";
* 通过wifiManager获取mac地址
* @attention Wifi
* @return Mac Address
*/publicvoidgetMacFromWifi(Context context){
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (!wifiManager.isWifiEnabled()) {
wifiManager.setWifiEnabled(true);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String mac = wifiInfo.getMacAddress();
// 获取当前时间public String time() {
long time = System.currentTimeMillis();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date(time);
String strTime = format.format(date);
return strT
}点击下载源码
欢迎加入Android技术交流群 ').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= i++) {
$numbering.append($('').text(i));
$numbering.fadeIn(1700);
以上就介绍了android 获取手机上面的IMSI序列号,IMEI,MAC地址,IP地址,当前时间,当前经纬度,获取网络类型,包括了Exception方面的内容,希望对Android开发有兴趣的朋友有所帮助。
本文网址链接:/article/detail_219530.html
电脑/手机小常识:自动打开Windows资源管理器有些情况下,借助Windows资源管理器来浏览文件夹要比直接打开每个文件夹并查看其中内容更加直观方便。一般我们可以在文件夹上单击鼠标右键并从中选择资源管理器,然而如果你有双击鼠标的操作习惯,那么我们还能够以更加快捷的方式打开文件夹。首先打开我的电脑,从工具菜单中选择“文件夹选项”,单击“文件类型”选项卡。在文件类型列表中,选择“文件夹”并单击“高级”按钮,在编辑文件类型对话框中,选择资源管理器,并单击“设为默认值”按钮。单击“确定”之后,再单击关闭。现在,当你在任意文件夹上进行双击时,将自动打开Windows资源管理器视图。
上一篇: 下一篇:查看帮助:
110旗下网站
& ChaHTC版权所有vivo手机怎么查IMEI码?三种vivo IMEI码查询方法图解
每个手机只有唯一的一个IMEI码,通过查询IMEI码可以验证手机的真伪及相关信息,尼玛额,vivo手机的IMEI码怎么查询呢?针对此问题,本文为大家介绍三种可以查询vivo手机IMEI码的方法
IMEI码是每个手机都要具备的标识,而且IMEI也是唯一的,所以通过查询IMEI码也可以验证手机的真伪相关信息。
那么vivo手机的IMEI码怎么查询呢?这里就介绍3种vivo手机IMEI码查询方法。
1.打开vivo手机,进入到拨号界面
2.在拨号盘上输入【*#06#】便可知道你的IMEI
在手机的背面的贴纸上有IMEI码
在手机的包装盒上贴有IMEI码
在获知了IMEI码后,可结合SN码到vivo官网查询(建议先注册vivo账号)

我要回帖

更多关于 安卓获取imei 的文章

 

随机推荐