Android體系ID知多少?【技術類】

摘要:移動Android設備體系ID您知道多少?

既本系列《移動設備ID煩惱知多少?》、《IOS體系ID知多少?》後我們來詳細看一下Android體系中的各種設備ID吧:

雖然Android相對能獲取到的ID的權利沒有IOS限制的那麼嚴格,但是也正是Android的山寨機橫行、2014年Android2.3基於Google Play推出了IDFA、各種ID滿天飛可能導致的麻煩問題比IOS只會多不會少。

一、Android6.0帶來的噩耗:

另外還有個噩耗是已發布有一段時間的Android6.0(代號棉花糖)推出了「運行時許可權」,簡單說就是App若需要獲取高密級的許可權需要每次詢問用戶是否同意,如下圖所示(左申請單許可權、右同時申請多許可權):

而不是像之前那樣在App安裝的時候需要的許可權全打上了勾,用戶也不在意,安裝好之後用戶也不能取消這些許可權。如下圖所示:

Android6.0系統還提供了一個用戶可以管理應用許可權的界面,通過這個界面用戶可以把已經授予的許可權再關閉,界面長得是這樣的:

二、IMEI

只有Android手機才獲取的到, IMEI號是一串15位的號碼,比如像這樣 359881030314356

獲取代碼如下:

TelephonyManager TelephonyMgr =(TelephonyManager)getSystemService(TELEPHONY_SERVICE);

String szImei = TelephonyMgr.getDeviceId();

需要許可權<uses-permissionandroid:name="android.permission.READ_PHONE_STATE" />

通常用戶會因為你向他們要了這個許可權而給你一個差評,因為他們覺得你就是在竊取他們的隱私,很明顯,你就是在收集一些數據。

注意:Android6.0運行時對此做了許可權限制:

其中「READ_PHONE_STATE」許可權是用來獲取deviceID,即IMEI號碼。所以一般建議在完全支持運行時許可權之前,將對應的值寫入到App本地數據中,對於新安裝的,可以採取其他策略減少對統計的影響。

我們大概統計了一下目前Android6.0大體市場佔比及IMEI用戶關閉獲取許可權的數據如下:

Android6.0在Android佔比20%左右,其中6.0有35%左右的用戶會禁止獲取IMEI。

三、無線網卡地址:

APP端無線網卡mac地址獲取方法:

WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);

WifiInfowifiInfo=wifiManager.getConnectionInfo();

String mac=wifiInfo.getMacAddress();

這種方法比較通用。

注意:最近在Android 6.0系統上,這個方法失效了,返回了「02:00:00:00:00:00」的常量。這並不是一個BUG,在google的博客中找到如下一段話:

Most notably, Local WiFi and Bluetooth MACaddresses are no longer available. The getMacAddress() method of a WifiInfoobject and the BluetoothAdapter.getDefaultAdapter().getAddress() method willboth return 02:00:00:00:00:00 from now on.

可以考慮使用NetworkInterface.getHardwareAddress。其原理和cat/sys/class/net/wlan0/address是一模一樣的,但是這個是上層API,不需要自己處理底層數據,在Android 6.0上測試通過。

NetworkInterface networkInterface =NetworkInterface.getByName("wlan0");

byte[] mac =networkInterface.getHardwareAddress();

問題:

1.如果重啟手機後,Wifi沒有打開過,是無法獲取其Mac地址的。(可以考慮授予CHANGE_WIFI_STATE許可權,開關一次wifi刷一下。)

2.有一些定製系統的目錄並不一樣。 例如三星的目錄為"cat/sys/class/net/eth0/address",所以是否對所以機型都有效有待驗證。(需要適配)

3.網上也有反映mac變更問題,是不是刷mac或者wifi故障導致,也不確定。

4.並不是所有的設備都有Wifi硬體,硬體不存在自然也就得不到這一信息。(這個還好)

5.需要 ACCESS_WIFI_STATE 許可權。(這個許可權還好,用戶比較容易通過)

B.通過WIFI上網或WIFI AP探針SSID廣播掃描WIFI AP均可以獲取這個設備的MAC地址。

四、ANDROID_ID

在設備首次啟動時,系統會隨機生成一個64位的數字,並把這個數字以16進位字元串的形式保存下來,這個16進位的字元串就是ANDROID_ID,當設備被恢復出廠設置後該值會被重置。可以通過下面的方法獲取:

import android.provider.Settings; String ANDROID_ID =Settings.System.getString(getContentResolver(),Settings.System.ANDROID_ID);

ANDROID_ID可以作為設備標識,但需要注意:

它在Android <=2.1 or Android>=2.3的版本是可靠、穩定的,但在2.2的版本並不是100%可靠的。

廠商定製系統的Bug:不同的設備可能會產生相同的ANDROID_ID:9774d56d682e549c。(摩托羅拉好像出現過這個問題)

廠商定製系統的Bug:有些設備返回的值為null。

設備差異:對於CDMA設備,ANDROID_ID和TelephonyManager.getDeviceId() 返回相同的值。

並且,如果某個Andorid手機被Root過的話,這個ID也可以被改變。

五、設備序列號(Serial Number, SN)

獲取辦法:

String serialNum = android.os.Build.SERIAL;

裝有SIM卡的設備獲取辦法:getSystemService(Context.TELEPHONY_SERVIEC).getSimSerialNumber();

注意對CDMA設備,返回的是一個空值。

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

在少數的一些設備上,會返回垃圾數據。對於沒有通話功能的設備,它可能會返回一個固定的值。

六、IDFA

2014年Android2.3基於Google Play推出了IDFA,功能同IOS的IDFA一樣,允許用戶重置或禁用該ID,由用戶決定是否願意被追蹤。由此就出現了各種各種ID的問題。設置界面如下圖所示:

但是在中國發行的國行手機由於某些原因,google地圖、Play等基礎App被閹割掉了,這樣導致在中國國行手機中都獲取不到該IDFA。(除非用戶自行Root並安裝google Play)

所以這也是市場中Android體系ID混亂的根本點所在。尤其突出的是google Adx在中國大量的Android流量長期無可用的ID標識的尷尬局面,這個問題google Adx今年應該有所調整。

七、OpenUDID

非Android官方提供的Api,由於Android體系ID較混亂,所以也有很多大廠在使用該ID。原代碼地址如下:github.com/vieux/OpenUD

用法如下:

* Addthis to your manifest:

<serviceandroid:name="org.openudid.OpenUDID_service">

<intent-filter>

<actionandroid:name="org.openudid.GETUDID" />

</intent-filter>

</service>

* Call`void OpenUDID_manager.sync(Context yourContext);` to initialize the OpenUDID

* Call`boolean OpenUDID_manager.isInitialized();` to check if the initialization isover (its asynchronous)

* Call`String OpenUDID_manager.getOpenUDID();` to retrieve your OpenUDID

目前國內市場上Android主要以IMEI作為廣告流量標識為主,國外市場主要以IDFA為主,但是隨著Android6.0的運行時許可權限制,Android體系中的ID將面臨洗牌。

(轉載請註明出處:微信訂閱號:ad_automation)

文字的表現力畢竟有限,若大家還比較迷糊的話,歡迎參加「1.7號的線下大課堂」專門增加了針對移動ID的專題,可面對面為您答疑解惑講透這些問題。

推薦閱讀:

假設安卓下個版本不再開源?
iPhone7,moto z,note7,選哪個?
如何寫一篇有創意的App更新日誌?
老師給了個創新項目:基於北斗衛星的導航系統 。具體是做一個 Android 應用程序 , 通過接收來自北斗衛星導航系統的定位數據,然後調用Google地圖 , 顯示用戶所在位置和周邊地圖 。我想問的是:是否可行?
如果你是HTC的CEO,你會怎麼拯救HTC?

TAG:移动互联网广告 | Android | 大数据 |