赞
踩
google对隐私管理越来越严格了,华为也出了个OAID来保护用户隐私。对于生成android设备唯一id一直没有个绝对完美的方案,只能说做到尽量唯一吧,这里做一下总结。
一、设备系统版本为Android Q
从 Android Q 开始,应用必须具有 READ_PRIVILEGED_PHONE_STATE 特许权限才能访问设备的不可重置标识符(包含 IMEI 和序列号)。许多用例不需要不可重置的设备标识符。如果您的应用没有该权限,但您仍尝试查询标识符的相关信息,则平台的响应会因目标 SDK 版本而异:
如果应用以 Android Q 为目标平台,则会发生 SecurityException。
如果应用以 Android 9(API 级别 28)或更低版本为目标平台,则相应方法会返回 null 或占位符数据(如果应用具有 READ_PHONE_STATE 权限)。否则,会发生 SecurityException。
注意:如果您的应用是设备所有者或配置文件所有者应用,那么即使您的应用以 Android Q 为目标平台,您也只需 READ_PHONE_STATE 权限即可访问不可重置的设备标识符。此外,如果您的应用具有特殊运营商权限,则无需任何权限即可访问这些标识符。
如果您的应用将不可重置的设备标识符用于广告跟踪或用户分析目的,请为这些特定用例创建 Android 广告 ID。要了解详情,请参阅唯一标识符的最佳做法。
待Android Q正式发布后再补充
二、设备系统版本为Android P及其以下
2. 友盟生成唯一id的方案
反编译了友盟统计analytics-6.1.4.jar,友盟生成唯一id的方案可以总结为:
SDK_INT<23:imei>mac地址(直接api获取)>android_id>serial number
SDK_INT=23:imei>mac地址(api获取,读取系统文件)>android_id>serial number
SDK_INT>23:imei>serial number>android_id>mac地址(api获取,读取系统文件)
反编译的代码如下,稍微修改了下方法名
public class DeviceIdUtil {
private static FileReader fileReader;
private static BufferedReader bufferedReader;
private static String getDeviceUniqueId(Context paramContext) {
String str = "";
if (Build.VERSION.SDK_INT < 23) {
str = getDeviceId(paramContext);
if (TextUtils.isEmpty(str)) {
str = getMacAddressFromWifiManager(paramContext);
if (TextUtils.isEmpty(str)) {
str = Settings.Secure.getString(paramContext.getContentResolver(), "android_id");
if (TextUtils.isEmpty(str)) {
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。