本文鏈接 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