设备标识获取方式

IMEI

描述:

  • Android版本 < 6.0,只需要READ_PHONE_STATE静态权限(安装App时即可获取到该权限),即可通过系统API TelephonyManager#getDeviceId API获取准确值;
  • 6.0 <= Android版本 <= 9.0,READ_PHONE_STATE升级为动态权限,安装App时不会获得该权限,需要在App运行时用户在弹窗确认授权后才可以获取
  • Android版本 >= 10.0,设备不可变ID的隐私保护得到进一步升级,需要READ_PRIVILEGED_PHONE_STATE权限才可以获取IMEI,而该权限只有系统级别的应用才可以获得,因此一般App无法获取到IMEI。

原始数据获取:

TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
deviceId = tm.getDeviceId(); 
// android版本>=10.0 不获取
  
@SuppressLint({"MissingPermission", "HardwareIds"})
public static String getImei(Context context) {
    String imei = "";
    try {
        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        imei = tm.getDeviceId();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return imei;
}
  

IDFA

描述:
目前iOS系统主流的广告获取设备标识符方式。用户可开启、关闭,每次切换会改变为新的取值。 10以下的版本关闭时也能取到唯一值, >=10的iOS版本关闭时取到的值为00000000000 ;系统大版本升级(如11 到 12) IDFA也会发生变化

原始数据获取:

idfa = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
  

Android ID

描述:
Android版本 = 8.0,应用签名、用户(即系统上的用户账号)和设备的每个组合都具有唯一的 ANDROID_ID值,即使系统升级也不变。

原始数据获取:

Settings.System.getString(context.getApplicationContext().getContentResolver(), Settings.System.ANDROID_ID);
  

OAID

描述:
移动安全联盟(简称MSA)制定的匿名设备标识符,保留原始值,不需要MD5编码。可用于android系统的补充设备标示,通常android10以上的国内主流设备都可以获取。具体OAID介绍以及最新覆盖厂商范围请详见 MSA官网

原始数据获取:
使用MSA官网提供的sdk