有很多場景和需求你需要用到手機裝置的唯一識別符號。
在android中,有以下幾種方法獲取這樣的id。
1. the imei: 僅僅只對android手機有效:
12
telephonymanagertelephonymgr=(
telephonymanager
)getsystemservice
(telephony_service
);string
szimei
=telephonymgr
.getdeviceid
();
採用此種方法,需要在androidmanifest.xml中加入乙個許可:android.permission.read_phone_state,並且使用者應當允許安裝此應用。作為手機來講,imei是唯一的,它應該類似於 359881030314356(除非你有乙個沒有量產的手機(水貨)它可能有無效的imei,如:0000000000000)。
2. pseudo-unique id, 這個在任何android手機中都有效
有一些特殊的情況,一些如平板電腦的設定沒有通話功能,或者你不願加入read_phone_state許可。而你仍然想獲得唯一序列號之類的東西。這時你可以通過取出rom版本、製造商、cpu型號、以及其他硬體資訊來實現這一點。這樣計算出來的id不是唯一的(因為如果兩個手機應用了同樣的硬體以及rom 映象)。但應當明白的是,出現類似情況的可能性基本可以忽略。要實現這一點,你可以使用build類:
12 34 5
6 78 9
1011
1213
1415
stringm_szdevidshort
="35"
+//we make this look like a valid imei
build
.board
.length
()%10
+build
.brand
.length
()%10
+build
.cpu_abi
.length
()%10
+build
.device
.length
()%10
+build
.display
.length
()%10
+build
.host
.length
()%10
+build.id
.length
()%10
+build
.manufacturer
.length
()%10
+build
.model
.length
()%10
+build
.product
.length
()%10
+build
.tags
.length
()%10
+build
.type
.length
()%10
+build
.user
.length
()%10
;//13 digits
大多數的build成員都是字串形式的,我們只取他們的長度資訊。我們取到13個數字,並在前面加上「35」。這樣這個id看起來就和15位imei一樣了。
3. the android id
通常被認為不可信,因為它有時為null。開發文件中說明了:這個id會改變如果進行了出廠設定。並且,如果某個andorid手機被root過的話,這個id也可以被任意改變。
1
stringm_szandroidid
=secure
.getstring
(getcontentresolver
(),secure
.android_id
);
returns: 9774d56d682e549c . 無需任何許可。
4. the wlan mac address string
是另乙個唯一id。但是你需要為你的工程加入android.permission.access_wifi_state 許可權,否則這個位址會為null。
12
wifimanagerwm=(wifimanager
)getsystemservice
(context
.wifi_service
);string
m_szwlanmac=wm
.getconnectioninfo
().getmacaddress
();
returns: 00:11:22:33:44:55 (這不是乙個真實的位址。而且這個位址能輕易地被偽造。).wlan不必開啟,就可讀取些值。
5. the bt mac address string
只在有藍芽的裝置上執行。並且要加入android.permission.bluetooth 許可權.
123
bluetoothadapterm_bluetoothadapter
=null
;// local bluetooth adapter
m_bluetoothadapter
=bluetoothadapter
.getdefaultadapter
();string
m_szbtmac
=m_bluetoothadapter
.getaddress
();
returns: 43:25:78:50:93:38 . 藍芽沒有必要開啟,也能讀取。
combined device id
綜上所述,我們一共有五種方式取得裝置的唯一標識。它們中的一些可能會返回null,或者由於硬體缺失、許可權問題等獲取失敗。
但你總能獲得至少乙個能用。所以,最好的方法就是通過拼接,或者拼接後的計算出的md5值來產生乙個結果。
12 34 5
6 78 9
1011
1213
1415
1617
1819
2021
2223
stringm_szlongid
=m_szimei
+m_szdevidshort
+m_szandroidid
+m_szwlanmac
+m_szbtmac
;// compute md5
messagedigestm=
null
;try
catch
(nosuchalgorithmexceptione)
m.update
(m_szlongid
.getbytes
(),0
,m_szlongid
.length
());
// get md5 bytes
byte
p_md5data
=m.digest
();// create a hex string
string
m_szuniqueid
=new
string
();for
(inti=
0;i<
p_md5data
.length;i
++)// hex string to uppercase
m_szuniqueid
=m_szuniqueid
.touppercase
();
通過以上演算法,可產生32位的16進製制資料:
9dddf85aff0a87974ce4541bd94d5f55
現在你就可以對其進行你的應用了。
**:
Android獲取手機唯一標識
1.許多應用都有這樣的需求獲取你的手機唯一標識,當你解除安裝軟體重新安裝的時候也要保證這個唯一標識不變,所以只能根據手機硬體的去獲取到唯一標識.2.有好多跟硬體相關都會有各種許可權問題。一種很簡單直接獲取到read phone state的許可權,讀取到裝置串號.3.如果是android6.0系統需...
獲取android手機唯一標識
因為很多軟體都有這個功能,所以說是非常重要的,比如說乙個使用者賬號只能繫結3個裝置,那麼得到裝置的唯一標示將是非常重要的。我猜那麼你肯定首先想到的就是得到裝置imei,telephonymanager telephonymanager telephonymanager context.getsyst...
Android唯一標識
github位址 android中能作為唯一標識有四個,但付出一定的代價還是還是能改變,所以目前android中沒有絕對的唯一標識。1 裝置id imei 需要授予許可權 telephonymanager telephonymanager telephonymanager getsystemserv...