获取Android唯一标识的方法归纳

问题一:为什么有需要获取Android唯一标识的需求呢?
答:电商app经常会看见该活动仅限当前设备当前账号领取。【每个用户、每台设备只能领取一次】
问题二:作为开发,那我们怎么知道用户当前的设备有没有领取过呢?
答:如果,当前设备领取过,那我们就记录当前设备的唯一标识呗。
问题三:那我们怎么获取当前设备的唯一标识呢?
请阅读下文,我们进一步思考🤔

其实,我想说没有什么办法能做到百分之一百的唯一


Android唯一标识汇总

  • 硬件唯一标识符 【需要读取手机权限,可强制】

    • Android ID
    • IMEI
    • 用户手机号 【如何避免小号???】
  • 动态生成唯一标识符

    • 随机生成 UUID。【 UUID.randomUUID().toString()】
  • 第三方安全公司

    • 同盾方案 【可解决部分小号】

一种获取唯一标识的思路

以下方案为个人提供,仅供参考

可用场景,强制用户提供读取手机权限、登录时获取
* Android ID + IMEI 组合生成 UUID 结合 用户手机号码匹配来区分
* 可使生产的唯一标志长度一致
* 加上同盾处理小号【可杜绝大部分刷单用户】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**
* 创建全球唯一的Android标识符
* @param context 上下文
* @return 获取的唯一标识符
*/
public static String getDeviceId(Context context) {
//通过拼接字符串的方式
StringBuilder stringBuilder = new StringBuilder();
// 为了避免该字符串为null,先拼接
stringBuilder.append( "固定一个值,随便写,一经使用概不能换" );
//获取设备唯一标识
String tmDeviceId = null;
if (ActivityCompat.checkSelfPermission( context, Manifest.permission.READ_PHONE_STATE ) == PackageManager.PERMISSION_GRANTED) {
final TelephonyManager tm = (TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE );
if (tm != null) {
// Could well be set to null!
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
tmDeviceId = tm.getImei();
} else {
tmDeviceId = tm.getDeviceId();
}
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
tmDeviceId = Build.getSerial();
} else {
tmDeviceId = Build.SERIAL;
}
}
}
// 拼接唯一标志
stringBuilder.append( tmDeviceId );
//生成唯一hashCode
int customHash = stringBuilder.toString().hashCode();
// 获取Android ID
String androidIDString = "" + Settings.Secure.getString( context.getContentResolver(), Settings.Secure.ANDROID_ID );
// 通过Android ID + 上面的拼接字符串 【生成唯一UUID】
UUID deviceUuid = new UUID( androidIDString.hashCode(), ((long) customHash << 32) );
//返回该唯一标识
return deviceUuid.toString();
}

注意

  • 以上方案,在没权限和有权限下,会返回两个设备唯一标识。
  • 需要开发者,强制获取用户唯一标志的情况下,方可。
  • 同盾反欺诈链接,该第三方sdk为付费。

参考