Android设备唯一标识符(适配Android Q)
目录
一、需求场景
目前常见的使用场景:
1、标识唯一设备,用于数据统计或者后台服务精准下发
2、用于账号与设备绑定
例如,数据上报到自己的统计服务器;
根据特定用户下发奖励或者其他;
会员账号只能绑定3个设备终端
基于以上需求,我们需要可以获取到当前设备的唯一标识符
二、Android设备信息
1、DeviceId(IMEI)
对于GSM手机来说,DeviceId为IMEI,而对于CDMA手机而言则为MEID,目前国内大部分手机主要是IMEI
IMEI是国际移动设备识别码,即通常说的手机串号,用于标识在移动电话网络中每一部独立的手机等移动通信设备。
(1)获取方式
/**
* 获取设备ID,GSM手机为IMEI、CDMA手机为MEID
*
* @param context
* @return
*/
public static String getDeviceId(Context context) {
if (context == null) {
return "";
}
try {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (PermissionUtils.checkPermissionForApi23(context, Manifest.permission.READ_PHONE_STATE)) {
return telephonyManager.getDeviceId();
} else {
LogUtils.e(TAG, "getDeviceId error: permission denied");
}
} catch (Exception e) {
e.printStackTrace();
LogUtils.e(TAG, "getDeviceId error: " + e.getMessage());
}
return "";
}
(2)缺点
- 在Android6.0以及之后,需要动态获取android.permission.READ_PHONE_STATE 权限。因此存在用户拒绝授权的可能,此外首次启动后就上报设备ID时也可能影响启动速度
- 可能存在获取不到DeviceId的可能,存在返回null或者000000的垃圾数据可能
- 只对有电话功能的设备有效(无需插卡,但是需要有对应硬件模块)。例如在部分pad上可能无法获取到DeviceId
2、AndroidId
设备首次启动后系统会随机生成一个64位的数字,用16进制字符串的形式表示,例如:4351daa4516303b3,4351 daa4 5163 03b3
(1)获取方式
/**
* 获取AndroidId
*
* @param context
* @return
*/
public static String getAndroidId(Context context) {
if (context == null) {
return "";
}
String androidId = Settings.Secure.getString(context.getContentResolve