Android终端唯一性获取

Posted 北京安荣科技

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android终端唯一性获取相关的知识,希望对你有一定的参考价值。

最近因项目需求,需要进行终端和人员信息绑定,并且能够进行唯一性验证,之前写过获取终端唯一标识的工具类,基于各种情况,这两天又进行了代码修改和逻辑。

在得到厂商系统的系统签名可通过系统权限获取到终端唯一标识的情况不在此篇说明之内,此篇仅说明在任意android终端上获取终端标识,在包括获取不到权限、无通话功能设备等情况下进行终端唯一性标识获取。

要完成终端唯一性校验,首先要知道在移动终端上有哪些字段可作为唯一性标识:

androidID(deviceSN):此字段是Android系统软件的唯一标识,一般在终端第一次开机时生成。在恢复出厂设置后会重置,(升级ROM可能会造成重置,未得到验证),此字段在生成的时候可能会有BUG:不同的设备可能会产生相同的ANDROID_ID:9774d56d682e549c,有些厂商的返回是NULL。

好处在于不需要获取权限即可进行获取

判断deviceSN合法性:(不为空并且不等于9774d56d682e549c)

获取androidID代码如下:

android.provider.Settings.Secure.getString(context.getContentResolver(),android.provider.Settings.Secure.ANDROID_ID);

DevcieID(IMEI、MEID):Android提供API可以获取设备ID。这个字段是最接近设备唯一标识的字段,也是具备实际参考意义的设备标识,即在设置中和设备出厂包装上可以提取到该字段。

但该字段有以下问题:

1. 如果是移动、联通手机,获取的是IMEI,如果是电信手机获取的是MEID(联通、移动的手机属于GSM网络,电信手机属于CDMA网络)。

2. 如果是双卡双待的手机,会有两个IMEI号和一个MEID号,装了电信SIM卡无论在哪个卡槽都返回MEID。如果是移动、或联通手机,放置在卡槽1和放置在卡槽2会返回不同的IMEI。

3. 此设备ID依赖通话硬件功能,如果没有通话功能则不会有DeviceID,返回的是null。

4. 获取DeviceID需要应用获取通话权限,许多国产定制的ROM会对此进行限制,可能获取了通话权限但是不能获取DeviceID,返回是15个0,比如华为 Mate 9 ,如果不在手机管家中授权,则返回的DeviceID为15个零。

5. 在少数的一些设备上,可能会返回一些垃圾无意义的字符。

判断deviceID合法性:(不为空并且不以6个0开始)

系统提供的获取该字段的方法如下:

TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

manager.getDeviceId()

UUID:通过JavaAPI获取UUID来作为设备唯一标识,此方法问题在于如果用户清除了应用信息或者重新安装了应用,则会造成设备唯一标识不同。

Android终端唯一性获取

综上所述:

做出如下处理,首先通过AndroidID来生成设备标识uuid,如果AndroidID获取有问题,则顺延至DeviceID获取设备标识,如果AndroidID和DeviceID处理都有问题(概率较低),则使用随机的UUID来作为设备的唯一标识,唯一标识的第一位用来标识通过何种途径生成,如果首位为1,则通过AndroidID生成,如果首位为2,则通过deviceID生成,如果首位为3,则是随机数生成。

设备标识生成,在服务端判断时,想到了以下情况:

  • 当uuid一致的时候,说明设备是同一个设备,返回true

  • 当uuid不一致时,查看是否根据SN码生成,如果是根据SN码生成,则证明设备已更换,返回false;

    查看sn码是否正确(不等于空并且不等于"9774d56d682e549c")

  • 当uuid不一致时,并且根据deviceID生成,说明SN码出现问题,不足以验证设备。需要根据deviceID来验证,如果deviceID校验成功并且比较通过则返回true反之则返回false;(但是如果deviceID相同那么UUID也一定相同,除非一个是根据DeviceID生成,一个是根据UUID或者SN码生成)

    查看deviceID是否正确(不等于空并且不以”000000”开头)

  • 当UUID不一致时,并且是随机UUID生成,说明SN码和deviceID获取都出现了问题,而随机UUID变化了此时有两种情况,一种是清除了软件存储或重装软件,一种是更换设备,此时返回false即可;

分析之后,服务端判断条件可如下:

当UUID不同时,即认定设备变更。保险起见,如果UUID不同,判断一次DeviceID,如果相同则设备相同。但UUID不同,DeviceID符合时的信息要记录,方便后期分析。

流程图如下:

Android终端唯一性获取

判断系统信息是否发生变化流程图如下:

Android终端唯一性获取

判断通话信息是否发生变化流程图如下:

Android终端唯一性获取

Android终端唯一性获取

 

另附:终端信息说明

终端信息可分类为3类:

设备信息:(硬件信息,设备名称,制造厂商,分辨率等,一般来说设备不换那么这些信息就不会变)

系统软件信息:(sn码,osName,系统版本号,Android版本号等,可能会随着恢复出厂设置或升级RMO变化)

Android系统软件的唯一标识是SN码

如果SN码变更有两种情况(恢复出厂设置或升级),恢复出厂设置一定会导致SN码变更,但是升级Rom未知,所以当SN码变更时,对应的Android系统软件信息会发生变化,所以要记录对应的系统软件信息。

但是判断系统软件信息变化需要两个字段:如果SN码变化,则系统软件信息一定会变化,如果SN码不变,但是产品版本号(display)变化,则说明Android系统可能进行了升级,对应的系统软件信息会发生变化。

通话信息:(运营商、网络类型、imsi号)此处的唯一标识是IMSI(SIM卡号)

当IMSI变化时,说明手机卡更换,那么对应的运营商、手机网络会发生变化,那么DeviceID可能会发生变化:如果为GSM手机则返回imei,如果为CMDA返回为MEID。如果imsi发生变化,则记录对应的网络信息(通话网络信息),因为可能会造成对应的DeviceID发生变化,所以在设备信息内的DeviceID可能是多个,最多3个,两个IMEI号和一个MEID号。

终端信息表:


以上是关于Android终端唯一性获取的主要内容,如果未能解决你的问题,请参考以下文章

从 iPhone NFC 获取唯一 ID

如何获取Android唯一标识

如何获取Android唯一标识

如何获取Android唯一标识

如何获取Android唯一标识

如何获取Android唯一标识(唯一序列号)