Android 設(shè)備唯一標(biāo)識(shí)

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):

  • 用戶輕易重置
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容