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