1、常见标识方法
IMEI(国际移动设备识别码)
获取方式:通过拨打#06#查询手机的IMEI码,或者在Android应用中,通过TelephonyManager的getDeviceId()方法获取。
优点:具有唯一性且恢复出厂设置不会改变。
缺点:获取IMEI需要READ_PHONE_STATE权限,而且在Android 10.0之后,第三方应用无法获取设备的IMEI,即使申请了READ_PHONE_STATE权限,不建议将IMEI作为设备标识。
设备序列号(SN号)
获取方式:在Android 7.1或更早系统中,可以通过android.os.Build.SERIAL获取设备序列号;在Android 8.0及以上版本中,需要调用Build.getSerial()方法,但需要申请READ_PHONE_STATE权限。
优点:由厂商提供,具有一定的唯一性。
缺点:在Android 8.0及以上版本中,android.os.Build.SERIAL总是返回"unknown",从Android 10.0及以上版本开始,获取设备序列号也被禁止。
MAC地址
获取方式:通过WifiManager的getConnectionInfo().getMacAddress()方法获取已连接WiFi的MAC地址;或者通过NetworkInterface的getByName("wlan0").getHardwareAddress()方法获取WiFi模块的MAC地址。
优点:设备的物理地址,对于有WiFi模块的Android设备来说是一种有效的标识方式。
缺点:出于隐私考虑,官方不建议获取MAC地址,从Android 6.0开始,通过WifiManager获取的MAC地址将是固定的(02:00:00:00:00:00),而且在Android 7.0之后,读取/sys/class/net/wlan0/address也无法获取到MAC地址。
ANDROID_ID
获取方式:通过Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID)获取。
优点:获取门槛最低,不需要任何权限,具有64位的取值范围,相对来说唯一性较好。
缺点:刷机、Root或恢复出厂设置等操作会导致ANDROID_ID改变,在Android 8.0及以上版本中,ANDROID_ID的规则发生了变化,对于升级到8.0之前安装的应用,ANDROID_ID会保持不变;对于安装在8.0系统的应用来说,ANDROID_ID根据应用签名、用户和设备三者的组合而不同,这两点可能会对广告联盟等产生影响,因此建议使用Advertising ID。
Advertising ID(AAID)
获取方式:依托于Google服务框架,如果手机内置该框架且能正常连接相关服务,则可以通过相应的API获取AAID。
优点:是非永久、可重置的标识符,专门用于广告行为,用户可以随时重置该类ID,或通过系统设置关闭个性化广告跟踪,更好地保护用户隐私。
缺点:如果手机没有内置Google服务框架、或框架不完整、或无法连接到相关服务,AAID可能不可用。
2、单元表格归纳
标识方法 | 获取方式 | 优点 | 缺点 |
IMEI | 拨打#06#或使用TelephonyManager的getDeviceId() | 唯一性高,恢复出厂设置不变 | Android 10.0后第三方应用无法获取 |
设备序列号(SN号) | Android 7.1及更早:android.os.Build.SERIAL Android 8.0及以上:Build.getSerial()(需权限) | 由厂商提供,有一定唯一性 | Android 8.0及以上版本获取受限 |
MAC地址 | WifiManager或NetworkInterface相关方法 | 设备物理地址,有效标识(有WiFi模块时) | 隐私考虑,Android 6.0及以后获取受限 |
ANDROID_ID | Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID) | 获取门槛低,无需权限,64位取值范围 | 刷机、Root或恢复出厂设置会改变;Android 8.0及以上规则变化 |
Advertising ID(AAID) | 依托Google服务框架获取 | 非永久、可重置,保护隐私 | 依赖Google服务框架,部分设备可能不可用 |
3、相关问题与解答
问题一:为什么Android设备唯一标识的获取这么困难?
解答:这主要是由于隐私保护和安全方面的考虑,随着用户对隐私保护意识的增强,操作系统开发者限制了应用对设备唯一标识符的访问权限,以防止用户信息被滥用,不同的Android版本和设备厂商之间的差异也增加了获取唯一标识的难度。
问题二:在开发Android应用时,应该如何选择合适的设备唯一标识方法?
解答:在选择设备唯一标识方法时,开发者需要综合考虑应用的需求、目标用户群体以及隐私政策等因素,如果应用需要跨设备跟踪用户行为或实现个性化推荐等功能,可以选择ANDROID_ID或Advertising ID等相对可靠的标识方法,并确保遵守相关的隐私政策和法律法规。