本文链接 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
Android设备标识-没有完美的解决方案-只有取舍