您的位置:首页 > 移动开发 > Android开发

有关获取android唯一识别号IMEI的问题

2018-01-11 13:17 176 查看
最近开发一个项目需要两个手机app互相通信,在一个手机不同的app之前通信可以用aidl,在不同的手机通信就需要用到网络(除通过运营商之外),我用的是socket通信,那么涉及到一个问题,服务器收到了某客户端发来的消息后到底转发给哪个手机的客户端呢,于是就想到了找到android手机的唯一识别号,有很多方式获得对一部手机的标识,但是获得手机的IMEI是误差最小的,也有可能获取不到的情况,但概率非常小,获得IMEI的代码如下

TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);

 imei = TelephonyMgr.getDeviceId();

最初我是在oncreate方法里获得的,自然没问题,后来随着需求改变,我需要在与服务器通信一个子线程中得到activty中获得的IMEI,首先想到新建了一个java文件(之后仔细一想这是个错误的思路,直接用hundler就好了啊,但是这个错误的思路带给我一个新的问题,使我更深入的了解了context),专门用来获得IMEI,但是这个方法出错了



才发现是因为getSystemService是Activity的一个方法,根据传入的NAME来取得对应的Object,然后转换成相应的服务对象。由于activity继承context,context贯穿了android最重要的部分,下面看一下context的继承结构



而我新建的java文件并没有传入一个上下文对象,因此出错了,解决方法是



这样就没有错误了。

显然这么做并不能解决问题,因为我的目的是让activity数据与子线程之前传递,现在我新建了一个类显然无意义,但是我又发现了一个问题,在我的activity的oncreate方法里获得的IMEI码



然后用第二种方式(即新建一个文件来实现获得IMEI功能,在MainActivity中调用这个方法)



然后显示结果是



为啥这两种方式获得的码不一样呢?(细心的可能会发现这里我获得的是IMSI码。因为一个是getDeviceId(),而第二种方法是getSubscriberId())

getDeviceId()是获得国际移动身份识别码,此码是全世界唯一。getSubscriberId()是国际移动用户识别码,是区别移动用户的标志。所以两个码不一样,这里使用IMEI码。

好了,现在回归正题,用handler传送IMEI,还有一个要注意的我的手机得到的IMEI是14位的,我以为是15位的呢,可能是刷机后就成了14位,在截取服务器发来的数据的时候String
getserverrecIMEI=content.substring(1, 16);出错,细数了一下才发现自己的IMEI是14位,因此提醒大家注意一下这个点。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: