使用IMEI作为唯一ID存数据库是否违反Google Play隐私政策?有无替代方案
关于IMEI采集的合规性问题
- 首先你当前的技术方案已经完全不可用:Android 10(API 29)及以上版本,第三方普通应用无法获取IMEI等不可重置的硬件标识符,你申请的
READ_PRIVILEGED_PHONE_STATE权限仅系统预装应用可获得,普通应用申请后也不会被授予,运行在高版本系统上时你的获取代码只会返回null,无法实现校验逻辑。 - 采集存储IMEI的行为确实违反Google Play隐私政策:Google明确规定,不可重置的硬件标识符不得用于非核心业务必要的用户跟踪、关联场景,你仅用于限制单设备账号注册的需求不属于必须使用IMEI的合理场景,上架时会被直接驳回,严重时会触发开发者账号处罚。
可替代的实现方案
推荐两个适配你现有Firebase技术栈、符合Google政策的方案:
方案1:使用Firebase Installations ID(FID)
这个是Firebase为每个应用实例生成的唯一ID,无需额外申请任何权限,只要用户不卸载应用、不清空应用数据就不会变更,完全适配Firebase生态,校验逻辑如下:
- 用户打开注册页时,先获取当前FID
- 到你的数据库中查询该FID是否已经绑定过账号
- 若已绑定则拦截注册流程,未绑定则注册成功后将该FID和用户账号绑定存储
获取FID的示例代码:
FirebaseInstallations.getInstance().getId() .addOnCompleteListener(task -> { if (task.isSuccessful()) { String fid = task.getResult(); // 执行后续校验逻辑 } });
方案2:使用ANDROID_ID
这个是Android系统在设备首次启动时生成的标识符,Android 8.0及以上版本中,不同签名的应用获取到的ANDROID_ID是独立的,不会泄露用户跨应用的设备标识,无需权限即可获取,只有用户恢复出厂设置才会变更,稳定性比FID更高(卸载重装也不会变)。
获取代码示例:
private String getAndroidId() { return Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID); }
注意事项
无论你使用上述哪种方案,都需要在应用的隐私政策中明确告知用户:你会收集对应的设备标识符,用于限制单设备仅可注册一个账号的功能,符合隐私合规要求即可正常上架。
内容的提问来源于stack exchange,提问作者Abdlhay
相关产品推荐
相关产品推荐

