获取Android设备唯一标识码
唯一標識碼這東西在網(wǎng)絡(luò)應(yīng)用中非常有用,例如檢測是否重復注冊之類的。
我們在項目過程中或多或少會使用到設(shè)備的唯一識別碼,我們希望能夠得到一個穩(wěn)定、可靠的設(shè)備唯一識別碼。今天我們將介紹幾種方式。
1. DEVICE_ID
假設(shè)我們確實需要用到真實設(shè)備的標識,可能就需要用到DEVICE_ID。在以前,我們的Android設(shè)備是手機,這個DEVICE_ID可以同通過TelephonyManager.getDeviceId()獲取,它根據(jù)不同的手機設(shè)備返回IMEI,MEID或者ESN碼,但它在使用的過程中會遇 到很多問題:
非手機設(shè)備: 如果只帶有Wifi的設(shè)備或者音樂播放器沒有通話的硬件功能的話就沒有這個DEVICE_ID權(quán)限: 獲取DEVICE_ID需要READ_PHONE_STATE權(quán)限,但如果我們只為了獲取它,沒有用到其他的通話功能,那這個權(quán)限有點大才小用bug:在少數(shù)的一些手機設(shè)備上,該實現(xiàn)有漏洞,會返回垃圾,如:zeros或者asterisks的產(chǎn)品
2. MAC ADDRESS
我們也可以通過手機的Wifi或者藍牙設(shè)備獲取MAC ADDRESS作為DEVICE ID,但是并不建議這么做,因為并不是所有的設(shè)備都有Wifi,并且,如果Wifi沒有打開,那硬件設(shè)備無法返回MAC ADDRESS.
Returns: 00:11:22:33:44:55 (這不是一個真實的地址。而且這個地址能輕易地被偽造。).WLan不必打開,就可讀取些值
3. Serial Number
在Android 2.3可以通過android.os.Build.SERIAL獲取,非手機設(shè)備可以通過該接口獲取。
Sim Serial Number
裝有SIM卡的設(shè)備,可以通過下面的方法獲取到Sim Serial Number:
TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String SimSerialNumber = tm.getSimSerialNumber();
注意:對于CDMA設(shè)備,返回的是一個空值!
4. ANDROID_ID
ANDROID_ID是設(shè)備第一次啟動時產(chǎn)生和存儲的64bit的一個數(shù),當設(shè)備被wipe后該數(shù)重置
Returns: 9774d56d682e549c . 無需任何許可。
ANDROID_ID似乎是獲取Device ID的一個好選擇,但它也有缺陷:
它在Android <=2.1 or Android >=2.3的版本是可靠、穩(wěn)定的,但在2.2的版本并不是100%可靠的在主流廠商生產(chǎn)的設(shè)備上,有一個很經(jīng)常的bug,就是每個設(shè)備都會產(chǎn)生相同的ANDROID_ID:9774d56d682e549c恢復出廠設(shè)置后會改變Root過后會被改變
對于CDMA設(shè)備,ANDROID_ID和TelephonyManager.getDeviceId() 返回相同的值。
5. Installtion ID : UUID
以上四種方式都有或多或少存在的一定的局限性或者bug,在這里,有另外一種方式解決,就是使用UUID,該方法無需訪問設(shè)備的資源,也跟設(shè)備類型無關(guān)。
這 種方式是通過在程序安裝后第一次運行后生成一個ID實現(xiàn)的,但該方式跟設(shè)備唯一標識不一樣,它會因為不同的應(yīng)用程序而產(chǎn)生不同的ID,而不是設(shè)備唯一ID。因此經(jīng)常用來標識在某個應(yīng)用中的唯一ID(即Installtion ID),或者跟蹤應(yīng)用的安裝數(shù)量。
同一個程序重新安裝也會不同
6. The BT MAC Address string
只在有藍牙的設(shè)備上運行。并且要加入android.permission.BLUETOOTH 權(quán)限.
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,并且用戶應(yīng)當允許安裝此應(yīng)用。作為手機來講,IMEI是唯一的,它應(yīng)該類似于 359881030314356(除非你有一個沒有量產(chǎn)的手機(水貨)它可能有無效的IMEI,如:0000000000000)。
Java:
Java代碼String myIMSI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI);// within my emulator it returns: 310995000000000String myIMEI = android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMEI);// within my emulator it returns: 000000000000000[java]view plaincopyStringmyIMSI=android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMSI);//withinmyemulatoritreturns:310995000000000StringmyIMEI=android.os.SystemProperties.get(android.telephony.TelephonyProperties.PROPERTY_IMEI);//withinmyemulatoritreturns:000000000000000
注:android.os.SystemProperties的標簽被打上@hide了,所以sdk中并不會存在。如果需要使用,需要有android的source code支持。
android.os.Build下
主板: + Build.BOARD系統(tǒng)啟動程序版本號: + Build.BOOTLOADER系統(tǒng)定制商: + Build.BRAND
cpu指令集: + Build.CPU_ABI
cpu指令集2 + Build.CPU_ABI2
設(shè)置參數(shù): + Build.DEVICE
顯示屏參數(shù): + Build.DISPLAY無線電固件版本: + Build.getRadioVersion()硬件識別碼: + Build.FINGERPRINT
硬件名稱: + Build.HARDWAREHOST: + Build.HOST修訂版本列表: + Build.ID硬件制造商: + Build.MANUFACTURER版本: + Build.MODEL硬件序列號: + Build.SERIAL手機制造商: + Build.PRODUCT描述Build的標簽: + Build.TAGSTIME: + Build.TIMEBuilder類型: + Build.TYPEUSER: + Build.USER
來自為知筆記(Wiz)
總結(jié)
以上是生活随笔為你收集整理的获取Android设备唯一标识码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上车准备
- 下一篇: 人民币贬值会让八类人损失惨重!有你吗?