獲取Android設備唯一標識碼


 唯一標識碼這東西在網絡應用中非常有用,例如檢測是否重復注冊之類的。


我們在項目過程中或多或少會使用到設備的唯一識別碼,我們希望能夠得到一個穩定、可靠的設備唯一識別碼。今天我們將介紹幾種方式。

1. DEVICE_ID

假設我們確實需要用到真實設備的標識,可能就需要用到DEVICE_ID。在以前,我們的Android設備是手機,這個DEVICE_ID可以同通過TelephonyManager.getDeviceId()獲取,它根據不同的手機設備返回IMEI,MEID或者ESN碼,但它在使用的過程中會遇 到很多問題:

  • 非手機設備: 如果只帶有Wifi的設備或者音樂播放器沒有通話的硬件功能的話就沒有這個DEVICE_ID
  • 權限: 獲取DEVICE_ID需要READ_PHONE_STATE權限,但如果我們只為了獲取它,沒有用到其他的通話功能,那這個權限有點大才小用
  • bug:在少數的一些手機設備上,該實現有漏洞,會返回垃圾,如:zeros或者asterisks的產品

2. MAC ADDRESS

我們也可以通過手機的Wifi或者藍牙設備獲取MAC ADDRESS作為DEVICE ID,但是並不建議這么做,因為並不是所有的設備都有Wifi,並且,如果Wifi沒有打開,那硬件設備無法返回MAC ADDRESS.

Returns: 00:11:22:33:44:55 (這不是一個真實的地址。而且這個地址能輕易地被偽造。).WLan不必打開,就可讀取些值

3. Serial Number

在Android 2.3可以通過android.os.Build.SERIAL獲取,非手機設備可以通過該接口獲取。

Sim Serial Number

裝有SIM卡的設備,可以通過下面的方法獲取到Sim Serial Number:

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); 
String SimSerialNumber = tm.getSimSerialNumber(); 

注意:對於CDMA設備,返回的是一個空值!

 

4. ANDROID_ID

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

Returns: 9774d56d682e549c . 無需任何許可。

ANDROID_ID似乎是獲取Device ID的一個好選擇,但它也有缺陷:

  • 它在Android <=2.1 or Android >=2.3的版本是可靠、穩定的,但在2.2的版本並不是100%可靠的
  • 在主流廠商生產的設備上,有一個很經常的bug,就是每個設備都會產生相同的ANDROID_ID:9774d56d682e549c
  • 恢復出廠設置后會改變
  • Root過后會被改變
  • 對於CDMA設備,ANDROID_ID和TelephonyManager.getDeviceId() 返回相同的值。

5. Installtion ID : UUID

以上四種方式都有或多或少存在的一定的局限性或者bug,在這里,有另外一種方式解決,就是使用UUID,該方法無需訪問設備的資源,也跟設備類型無關。

這 種方式是通過在程序安裝后第一次運行后生成一個ID實現的,但該方式跟設備唯一標識不一樣,它會因為不同的應用程序而產生不同的ID,而不是設備唯一ID。因此經常用來標識在某個應用中的唯一ID(即Installtion ID),或者跟蹤應用的安裝數量。

同一個程序重新安裝也會不同


6. The BT MAC Address string
只在有藍牙的設備上運行。並且要加入android.permission.BLUETOOTH 權限.

1 2 3
BluetoothAdapter m_BluetoothAdapter = null; // Local Bluetooth adapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();String m_szBTMAC = m_BluetoothAdapter.getAddress();

Returns: 43:25:78:50:93:38 . 藍牙沒有必要打開,也能讀取。

7.IMSI-ID / IMEI-ID 的方法。 

采用此種方法,需要在AndroidManifest.xml中加入一個許可:android.permission.READ_PHONE_STATE,並且用戶應當允許安裝此應用。作為手機來講,IMEI是唯一的,它應該類似於 359881030314356(除非你有一個沒有量產的手機(水貨)它可能有無效的IMEI,如:0000000000000)。
Java:

Java代碼 復制代碼 收藏代碼
  1. String myIMSI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI);  
  2. // within my emulator it returns: 310995000000000 
  3.  
  4. String myIMEI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMEI);  
  5. // within my emulator it returns: 000000000000000 
[java] view plaincopy
  1. String myIMSI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI);   
  2. // within my emulator it returns: 310995000000000   
  3.   
  4. String myIMEI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMEI);   
  5. // within my emulator it returns: 000000000000000   

注:android.os.SystemProperties的標簽被打上@hide了,所以sdk中並不會存在。如果需要使用,需要有android的source code支持。

android.os.Build下


主板: + Build.BOARD
系統啟動程序版本號: + Build.BOOTLOADER
系統定制商: + Build.BRAND
cpu指令集: + Build.CPU_ABI
cpu指令集2 + Build.CPU_ABI2
設置參數: + Build.DEVICE
顯示屏參數: + Build.DISPLAY
無線電固件版本: + Build.getRadioVersion()
硬件識別碼: + Build.FINGERPRINT
硬件名稱: + Build.HARDWARE
HOST: + Build.HOST
修訂版本列表: + Build.ID
硬件制造商: + Build.MANUFACTURER
版本: + Build.MODEL
硬件序列號: + Build.SERIAL
手機制造商: + Build.PRODUCT
描述Build的標簽: + Build.TAGS
TIME: + Build.TIME
Builder類型: + Build.TYPE
USER: + Build.USER





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM