1. 程式人生 > >[Android][獲取Android裝置唯一標識]

[Android][獲取Android裝置唯一標識]

1.落筆緣由

最近需要獲取能夠標誌Android裝置的唯一標識,但是由於Android系統版本不同或者root等諸多原因,造成有些裝置標識為NULL或者標識相同的問題,在網上搜索了相關資料,總結一下各種情況。

2.程式碼

import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.provider.Settings;
import
android.telephony.TelephonyManager; import android.util.Log; /** * @author Administrator * 2017-1-13 * 測試機型: * S7-601w 4.1.2系統 * IMEI,Serial,Mac,AndroidId都有 * FDR-A01w 5.1.1系統 * IMEI=null * 其他Serial,Mac,AndroidId都有 * 堅果 * IMEI,Serial,Mac,AndroidId都有 */ public class Test extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.test); Log.i("lgy", "IMEI:"+ getLocalIMEI(this)); Log.i("lgy", "Serial:"+getSerial()); Log.i("lgy", "Mac:"+getMac(this)); Log.i("lgy"
, "AndroidId:"+getAndroidId(this)); } /** *TODO 序列號 *從Android 2.3 (“Gingerbread”)開始可用,可以通過android.os.Build.SERIAL獲取,對於沒有通話功能的裝置,它會 *返回一個唯一的device ID * @return */ public String getSerial() { try { String str = android.os.Build.class.getField("SERIAL").get(null).toString(); return str; } catch (IllegalAccessException | IllegalArgumentException | NoSuchFieldException e) { e.printStackTrace(); } return null; } /** * * 獲取裝置的IMEI * IMEI *方式:TelephonyManager.getDeviceId(): *問題 *範圍:網上說“只能支援擁有通話功能的裝置,對於平板不可以”,但是我測試了型號FDR-A01w平板確實拿到的是null, *而 型號S7-601的平板卻能拿到。 *永續性:返廠,資料擦除的時候不徹底,保留了原來的標識。 *許可權:需要許可權:android.permission.READ_PHONE_STATE *bug: 有些廠家的實現有bug,返回一些不可用的資料 * @return */ public String getLocalIMEI(Context context) { TelephonyManager tm = null; try { tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (null != tm) { return tm.getDeviceId(); } } catch (Exception ex) { } finally { tm = null; } return null; } /** * Administrator * 2017-1-13 *TODO * Mac地址 *ACCESS_WIFI_STATE許可權 *有些裝置沒有WiFi,或者藍芽,就不可以,如果WiFi沒有開啟,硬體也不會返回Mac地址 * @return */ public String getMac(Context context) { WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); return info.getMacAddress(); } // Android Id /** * Administrator * 2017-1-13 *TODO * ANDROID_ID *2.2(Froyo,8)版本系統會不可信,來自主要生產廠商的主流手機,至少有一個普遍發現的bug,這些有問題的手機相同的ANDROID_ID: 9774d56d682e549c *但是如果返廠的手機,或者被root的手機,可能會變 * @param context * @return */ private static String getAndroidId(Context context) { String androidId = Settings.Secure.getString( context.getContentResolver(), Settings.Secure.ANDROID_ID); return androidId; } }
  1. android.os.Build能獲取的裝置資訊

由於在獲取序列號的時候使用到了Build,所以總結一下這裡能獲取的裝置資訊,網上也有總結過,所以我就不在一一去認真瞭解了,直接複製一下過來記錄一下,不過具體使用的時候還是要去看一下原始碼,因為有些可能已經Deprecated了。

android.os.Build.BOARD:獲取裝置基板名稱
android.os.Build.BOOTLOADER:獲取裝置載入程式版本號
android.os.Build.BRAND:獲取裝置品牌
android.os.Build.CPU_ABI:獲取裝置指令集名稱(CPU的型別)
android.os.Build.CPU_ABI2:獲取第二個指令集名稱
android.os.Build.DEVICE:獲取裝置驅動名稱
android.os.Build.DISPLAY:獲取裝置顯示的版本包(在系統設定中顯示為版本號)和ID一樣
android.os.Build.FINGERPRINT:裝置的唯一標識。由裝置的多個資訊拼接合成。
android.os.Build.HARDWARE:裝置硬體名稱,一般和基板名稱一樣(BOARD)
android.os.Build.HOST:裝置主機地址
android.os.Build.ID:裝置版本號。
android.os.Build.MODEL :獲取手機的型號 裝置名稱。
android.os.Build.MANUFACTURER:獲取裝置製造商
android:os.Build.PRODUCT:整個產品的名稱
android:os.Build.RADIO:無線電韌體版本號,通常是不可用的 顯示unknown
android.os.Build.TAGS:裝置標籤。如release-keys 或測試的 test-keys 
android.os.Build.TIME:時間
android.os.Build.TYPE:裝置版本型別  主要為"user""eng".
android.os.Build.USER:裝置使用者名稱 基本上都為android-build
android.os.Build.VERSION.RELEASE:獲取系統版本字串。如4.1.22.22.3等
android.os.Build.VERSION.CODENAME:裝置當前的系統開發代號,一般使用REL代替
android.os.Build.VERSION.INCREMENTAL:系統原始碼控制值,一個數字或者git hash值
android.os.Build.VERSION.SDK:系統的API級別 一般使用下面大的SDK_INT 來檢視
android.os.Build.VERSION.SDK_INT:系統的API級別 數字表示

android.os.Build.VERSION_CODES類 中有所有的已公佈的Android版本號。全部是Int常亮。可用於與SDK_INT進行比較來判斷當前的系統版本

4.總結
以上的內容大多是從網上摘抄過來的,是本著驗證內容是否正確並做筆記的目的寫這篇文章的,沒有用這篇文章盈利應該不算犯法吧!最後會附上摘抄文章的地址。

5.原始碼地址

6.參考文章