IMEI
IMEI 國際移動設備身份碼 目前GSM/WCDMA/LTE手機終端需要使用IMEI號碼,在單卡工程中一個手機號對應一個IMEI號,雙卡手機則會對應兩個IMEI號,一張是手機卡對應一個。
需要權限 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
TelephonyManager tm = (TelephonyManager)context.getSystemService(context.TELEPHONY_SERVICE);
String imei = tm.getDeviceId();
缺點
由以上可以看出使用IMEI來作爲Android的設備唯一標識符存在一定的弊端, Android 6.0以上需要動態授權READ_PHONE_STATE權限才能訪問,可能涉及隱私問題,如果用戶禁用掉相關權限,將獲取不到。
Android-Q以後 需要READ_PRIVILEGED_PHONE_STATE權限才能訪問,這個權限爲廠商擁有的權限,普通app沒有這個權限,所以取到的爲null
Mac地址
Mac 指的就是我們設備網卡的唯一設別碼,該碼全球唯一,一般稱爲物理地址,硬件地址用來定義設備的位置,硬件標識,刷機和恢復出廠設置不擦除,並且大多數android都有wifi模塊
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
一般是指wifi模塊或者藍牙模塊的mac地址。
缺點:
- 不穩定,有時候獲取不到,有時候獲取到了,卻是“假的”MAC地址(02:00:00:00:00:00);
- 基於隱私考慮,官方不建議獲取;6.0之後通過WifiManager 獲取不到真正的mac地址,7.0之後訪問不了/sys/class/net/wlan0/address;
-
不同的廠商有不同的限制,比如同樣是7.0,一加3可以訪問,小米6不可以訪問(至少當前是這樣的,以後怎麼發展就不知道了)。
Android-Q以後 有新的Api獲取mac地址,SDK未開放Api,暫不能測試
Android_Id
在設備首次運行的時候,系統會隨機生成一64位的數字,並把這個數值以16進制保存下來,這個16進制的數字就是ANDROID_ID,但是如果手機恢復出廠設置這個值會發生改變,如果設備被root,這個值可以任意改變。
String androidID = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
缺點
- 手機恢復出廠設置以後該值會發生變化
- 在國內Android定製的大環境下,有些設備是不會返回ANDROID_ID的
Android 8.0 以後
- 只要軟件包名稱和簽名密鑰相同,在軟件包卸載或重新安裝時,Android_Id 的值不會改變。應用可以依靠此值保持每次重新安裝之後的狀態。
- 如果應用安裝在運行更早版本 Android 的設備上,則除非卸載並重新安裝該應用,否則,在設備更新至 Android O 之後,應用的 Android ID 將保持不變。
Serial Number, SN(設備序列號)
String SerialNumber = android.os.Build.SERIAL
Android 8.0以前
- 獲取序列號不需要權限,但是有一定的侷限性,在有些手機上會出現垃圾數據,比如紅米手機返回的就是連續的非隨機數
也是不穩定的唯一標識,依賴廠商是否提供。
Android 8.0以後
- 對於針對 Android O 或更新版本的應用,現已棄用 android.os.Build.SERIAL。它們可以改爲使用新的 Android O API,即Build.getSerial(),只要調用方擁有 PHONE 權限,該函數將返回實際序列號。在未來版本的 Android 中,針對 Android O 的應用所查詢到的 Build.SERIAL 將顯示爲“UNKNOWN”。
UUID
UUID(Universally Unique Identifier)全局唯一標識符,是指在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。
每次調用都會生成一個全新的標識符
String uuid = UUID.randomUUID().toString();
因爲每次調用都生成新的,通常使用UUID都會存儲下來或者和其它字段拼接使用,CUID庫就使用了 uuid來拼接device_id字段
Advertising Id 需要手機支持Google 服務以及引入Google庫
Advertising ID(廣告ID)是由Google Play服務提供的用戶特定的,唯一的,可重置的廣告ID,適用於廣告用例。如果你應用程序想要使用廣告ID,你的設備就必須安裝Google Play Service
缺點:
- 用戶可以隨意重置,如上圖點擊重置按鈕
Instance Id 需要手機支持Google 服務以及引入Google庫
Instance ID的作用域爲創建它的應用,這樣可以防止他人利用該標識符跟蹤用戶在不同應用中的行爲。此外,此標識符還可以輕鬆地進行重置,因爲用戶可以清除應用數據或重新安裝應用後重置。
缺點:
- 用戶輕易重置