首页 > 代码库 > Android设备标识-没有完美的解决方案-只有取舍

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

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

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

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

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. 常用标识的组合

    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生成

1. 如果imei不为空,并且长度等于15,那么deviceid = android-imei-uuid-timestamp。否则进入2。
2. deviceid = android-uuid-timestamp

设备id读取

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