[Android][獲取Android裝置唯一標識]
阿新 • • 發佈:2019-01-08
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;
}
}
- 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.2 或2.2 或2.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.參考文章