目錄
DeviceId是什么?
基礎知識
國際移動設備識別碼(IMEI)
移動設備識別碼(MEID )
AndroidID
設備MAC地址
代碼獲取Android DeviceId?
參考文章
-
DeviceId是什么?
DeviceIdD是用來標識一臺Android物理設備的唯一id(后續統稱DID),那么如何獲取它呢?
Google提供了TelephonyManager.getDeviceId方法來獲取Android的DID,該API是獲取GSM手機的國際移動設備識別碼(IMEI)或者 CDMA手機的移動設備識別碼(MEID ),但該API存在一些限制,
因此,各大互聯網公司都有生產、維護DID的基建SDK,本文旨在梳理清DID的相關背景關系,
-
基礎知識
-
國際移動設備識別碼(IMEI)
全稱“International Mobile Equipment Identity”,是通常所說的手機序列號、手機“串號”,用于在移動電話網路中識別每一部獨立的手機等移動通信設備,相當于移動電話的身份證,序列號共有15~17位數字,通過在手機撥號鍵盤中輸入*#06#即可查詢,
但存在以下限制:
?1.自API23(Android 6.0)開始,獲取IMEI需要用戶予"android.permission.READ_PHONE_STATE";
2.自API29(Android 10.0)開始,您的應用必須是設備或個人資料所有者應用具有特殊運營商權限或具有 READ_PRIVILEGED_PHONE_STATE 特許權限,才能訪問這些識別符號,
3.某些小廠商某型號的手機IMEI可能相同,
-
移動設備識別碼(MEID )
全稱“Mobile Equipment Identifier”,是CDMA手機的身份識別碼,也是每臺CDMA手機或通訊平板唯一的識別碼,通過這個識別碼,網路端可以對該手機進行跟蹤和監管,用于CDMA制式的手機,MEID的數字范圍是十六進制的,和IMEI的格式類似,
存在的限制同IMEI的限制,
-
AndroidID
又稱SSAID,設備啟動時,隨機生成一個 64 位數字(表示為十六進制字串),對于應用簽名密鑰、用戶和設備的每個組合都是唯一的, ANDROID_ID 的值受簽名密鑰和用戶的限制,
但存在如下限制:
1.如果在設備上執行恢復出廠設定或 APK 簽名密鑰更改,則該值可能會更改,
2.某些小廠商的Android手機可能為null或相同,
-
設備MAC地址
MAC 地址具有全域唯一性,無法由用戶重置,在恢復出廠設定后也不會變化,
但存在如下限制:
在 Android 6.0(API 級別 23)到 Android 9(API 級別 28)中,本地設備 MAC 地址(如 WLAN 和藍牙)無法通過第三方 API 使用,WifiInfo.getMacAddress() 方法和BluetoothAdapter.getDefaultAdapter().getAddress() 方法會回傳02:00:00:00:00:00,
不過業界也有一些hack的做法,不建議使用,
其他諸如BuildSerial、GoogleAID也有各種各樣的限制,在這里不做統一贅述,
-
代碼獲取Android DeviceId?
該段代碼參考自:I am getting IMEI null in Android Q?,簡化代碼&添加注釋,
Android版本號參考:Android歷史版本
需要說明的是,這段代碼僅適用于Demo級產品的大多數場景,并不能完全保證DID的唯一性,
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String deviceId = getIMEIDeviceId(this);
Log.i("deviceId is:", deviceId);
}
public static String getIMEIDeviceId(Context context) {
String deviceId;
//當APK運行在Android10(API>=29)及以上時,獲取到的是AndroidID
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
deviceId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
} else {
final TelephonyManager mTelephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
//當APK運行在Android6.0(API>=23)及以上時,需要check有無READ_PHONE_STATE權限,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (context.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
return "";
}
}
assert mTelephony != null;
//如果TelephonyManager獲取到的DeviceId不為null
if (mTelephony.getDeviceId() != null) {
//獲取GSM手機的國際移動設備識別碼(IMEI)或者 CDMA手機的移動設備識別碼(MEID).
deviceId = mTelephony.getDeviceId();
} else {
//如果DeviceId為null,我們的DID依然是AndroidID,
deviceId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
}
}
return deviceId;
}
}
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
-
參考文章
唯一識別符號最佳做法
TelephonyManager
I am getting IMEI null in Android Q?
Android 10 使用getDeviceId()和getIMEI()的問題及方案
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/299710.html
標籤:其他
上一篇:在vue中使用axios
下一篇:幣王Biking9月12日資訊
