1. 程式人生 > >如何唯一的標識一臺Android設備?

如何唯一的標識一臺Android設備?

基本 信息 生成 nal 裝備 代碼 report 開始 display

UUID : (Universally Unique Identifier)全局唯一標識符,是指在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。由以下幾部分的組合:當前日期和時間(UUID的第一個部分與時間有關,如果你在生成一個UUID之後,過幾秒又生成一個UUID,則第一個部分不同,其余相同),時鐘序列,全局唯一的IEEE機器識別號(如果有網卡,從網卡獲得,沒有網卡以其他方式獲得)。

IMEI : (International Mobile Equipment Identity) 是國際移動設備身份碼的縮寫,國際移動裝備辨識碼,是由15位數字組成的"電子串號",它與每臺手機一一對應,而且該碼是全世界唯一的。

MEID :( Mobile Equipment IDentifier )是全球唯一的56bit CDMA制式移動終端標識號。標識號會被燒入終端裏,並且不能被修改。可用來對CDMA制式移動式設備進行身份識別和跟蹤。

兩者的區別在於:IMEI是手機的身份證,MEID是CDMA制式(電信運營的)的專用身份證;IMEI是15位,MEID是14位。

DEVICE_ID

根據不同的手機設備返回IMEI,MEID或者ESN碼,可以根據以下代碼獲得:

技術分享
Device_Id

非手機設備:最開始搭載Android系統都手機設備,而現在也出現了非手機設備:如平板電腦、電視、音樂播放器等。這些設備沒有通話的硬件功能,系統中也就沒有TELEPHONY_SERVICE,自然也就無法通過上面的方法獲得DEVICE_ID。

權限問題:獲取DEVICE_ID需要READ_PHONE_STATE權限,在Android 6.0上使用運行時動態授予權限的機制,一旦用戶不給予授權,將獲取不到DEVICE_ID。

廠商定制系統中的Bug:少數手機設備上,由於該實現有漏洞,會返回垃圾(這是開發者博客的原話,沒有實踐過)。

MAC ADDRESS

技術分享
MAC_Address

可以使用手機WiFi或藍牙的MAC地址作為設備標識,但是並不推薦這麽做,原因有以下兩點:

硬件限制:並不是所有的設備都有WiFi和藍牙硬件,硬件不存在自然也就得不到這一信息。

獲取的限制:如果WiFi沒有打開過,是無法獲取其Mac地址的;而藍牙是只有在打開的時候才能獲取到其Mac地址。

Serial Number

硬件序列,在Android 2.2 以上可以通過 android.os.Build.SERIAL 獲得序列號。在一些沒有電話功能的設備會提供,某些手機上也可能提供(所以就是經常會返回Unknown)

ANDROID_ID

ANDROID_ID是設備第一次啟動時產生和存儲的64bit的一個數,當設備被wipe後該數重置。

技術分享
Android_Id

ANDROID_ID似乎是獲取Device ID的一個好選擇,但它也有缺陷:在主流廠商生產的設備上,有一個很經常的bug,就是每個設備都會產生相同的ANDROID_ID:9774d56d682e549c 。同時刷機,或者重置ANDROID_ID的值都會變化。

接下來就來看看實際的標識方法:

第一種:Installtion ID

在程序安裝後第一次運行時生成一個ID,該方式和設備唯一標識不一樣,不同的應用程序會產生不同的ID,同一個程序重新安裝也會不同。所以這不是設備的唯一ID,但是可以保證每個用戶的ID是不同的。 可以說是用來標識每一份應用程序的唯一ID(即Installtion ID),可以用來跟蹤應用的安裝數量等(其實就是UUID)。

技術分享
Installtion Id 獲取方法

第二種:UniquePsuedoID

通過讀取設備的ROM版本號、廠商名、CPU型號和其他硬件信息來組合出一串15位的號碼和設備硬件序列號作為種子生成UUID。一串15位的號碼(批量生產的設備每項信息基本相同,所以這一段相同的可能性特別高);硬件序列,在一些沒有電話功能的設備會提供,某些手機上也可能提供(Devices without telephony are required to report a unique device ID here; some phones may do so also.),所以就是經常會返回Unknown。

技術分享
UniquePsuedoID 獲取方法

第三種:Universal ID

首先通過讀取Android_id,作為UUID的種子。若得到Android_Id等於9774d56d682e549c或者 發生錯誤則random一個UUID作為備用方案,最後把得到的UUID同時存入內部存儲和外部存儲。下次使用UUID的時候優先從外部存儲讀取,再從背部存儲讀取,最後在重新生成,盡可能的保證其不變性。

技術分享
Universal_id獲取方法

參考文檔:http://android-developers.blogspot.jp/2011/03/identifying-app-installations.html


來源: http://www.jianshu.com/p/178786f833b6

來自為知筆記(Wiz)

如何唯一的標識一臺Android設備?