Android设备标识-没有完美的解决方案-只有取舍

xiaoxiao2021-02-28  186

本文链接    http://blog.csdn.net/xiaodongrush/article/details/28864845

1.  几种常用的设备标识码

     IMEI,Sim卡序列号,Wifi模块Mac地址,Android_ID

[java]  view plain  copy  print ? TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);   String imei = telephonyManager.getDeviceId();   String simNo = telephonyManager.getSimSerialNumber();   WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);   String wifiAddress = wm.getConnectionInfo().getMacAddress();   String androidId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);       IMEI是可以用软件直接改写的,重复是无法避免的,标准是15位数字,有些设备上,连这个标准都保证不了。IMEI与每台手机对应,PAD没有IMEI。此外,小米2上发现,如果不信任一个APP,那么这个APP将读取不到IMEI,即读到的结果是null。IMEI是有多么的不靠谱。     PAD没有Sim卡,自然也没有Sim卡序列号,双卡的手机还会有两个Sim卡序列号。PAD也麻烦的,没有IMEI,没有SIM卡序列号。     某些手机或者设备没有Wifi模块,Mac地址读取不到。一个移动设备都有wifi,这个应该都会有,不过也是不能保证不重复。     Android_ID在每次恢复工厂模式后,都会重新生成,另外个别手机存在bug,产生的Android_ID都是一样的。与其交给系统产生id,还不如自己产生id。

2. 常用标识的组合

[java]  view plain  copy  print ? 1. 如果IMEI不为空,返回IMEI,否则,进入2   2. 如果Sim卡序列号不为空,返回序列号,否则,进入3   3. 如果MAC地址不为空,md5(mac+"mac_address"),否则进入4   4. 如果Android_ID不为空,返回Android_ID,否则进入5   5. 返回"invalid_imei"  

    如果是统计APP的安装量一般用上面这些方法就可以了。这样统计到的设备数量只会更少,不会更多。

3. 如果要实现设备管理这样的功能怎么办

    这就要求保证每个设备的标识不能重复,因此使用上面的方法就不行了。使用UUID来处理,并且持久化到SharedPreference和SD卡,这样只要APP和文件没有同时被干掉,就不会重新生成新的标识。

设备id生成

[java]  view plain  copy  print ? 1. 如果imei不为空,并且长度等于15,那么deviceid = android-imei-uuid-timestamp。否则进入2。   2. deviceid = android-uuid-timestamp  

设备id读取

[java]  view plain  copy  print ? 1. 如果从sharedpreference中,读到deviceid,将该id存储到sd卡上,返回改id,否则进入2   2. 如果sd卡中,读到deviceid,那么将该id存储到sharedpreference,返回该id,否则进入3   3. 生成deviceid,存储到sd卡和sharedpreference中  

4. 参考文章

    http://android-developers.blogspot.com/2011/03/identifying-app-installations.html

转载请注明原文地址: https://www.6miu.com/read-18909.html

最新回复(0)