Android 设备的唯一标识符 - 不可用。

4

我希望为我的库使用唯一标识符,因为同一个手机中的多个应用程序可以利用相同的唯一ID。例如,安卓手机A - 可以在手机A上有3个应用程序,所有3个应用程序都集成了同一个库,因此所有3个应用程序必须使用相同的ID来将其识别为1个设备,而不是具有3个不同的ID。另外,该应用程序可以从3个不同的构建机器发布,并且应用包名称可能并不总是已知。

  • 我尝试过使用广告 ID,但不是所有手机都支持,有些手机可以访问,而有些手机则无法检索。
  • IMEI - 需要额外的权限,并且在android 10之后不可用,因为大多数结果都是空字符串
  • 我尝试过 Android ID,它是唯一的,但如果您有2个不同的构建机器用于不同或相同的apk,则它将分配2个不同的Android ID,而不是1个。
  • 尝试了 Shared preferance、Broadcast reciver、Content Provider 和 File R&W 方法来创建自己的唯一标识符,但它们都无法实现。
  • 对于广播接收器,两个应用程序需要同时处于活动状态才能共享信息
  • 对于内容提供程序,只能有1个相同名称的内容提供程序,如果特定应用程序创建了内容提供程序,则删除该应用程序,内容提供程序也将被删除。
  • 共享首选项需要为其他应用程序提供包名称,并且不支持读取模式。它不适用于库软件包名称,而是需要应用程序包名称。
  • 文件 R&W - 有些手机可以正常工作,有些则不行,有时即使删除文件,它仍然显示文件存在,一些制造商手机不允许从公共目录中读取。

测试过的设备: 三星 - Android 9、10和11 小米- Android 9、10和11 华为- Android 9和10


你想让你的库能够跨多个应用程序追踪同一设备吗? - Taranmeet Singh
是的 @TaranmeetSingh - AHMED
1个回答

3
根据 Android最佳实践 的定义,您不应使用任何硬件ID,例如IMEI、MAC地址等。
这意味着您只能使用Google广告ID(GUID)或Firebase安装ID(FID),或者创建自己的唯一ID解决方案,这些都是由软件生成的ID,可以通过诸如恢复出厂设置之类的操作进行重置。
如果您可以接受一小部分用户仍然能够重置设备ID(这在当前公司中是预期的),那么您可以使用账户管理器API来共享应用程序生成的ID。虽然这通常用于通过共享令牌和用户名为公司的所有应用程序创建单个登录,但您可以重新利用账户管理器API来共享唯一ID。每当安装一个应用程序时,请将您的唯一ID写入账户管理器;当安装新应用程序时,请检查此ID是否已存在,如果存在,则使用相同的ID,否则创建一个新ID并写入账户管理器。

仍然会有一些用例,其中相同的手机将由新ID表示,但这样的特殊情况将是零星的,我认为可以忽略。


没错,我同意。目前我已经实施了 Account Manager API 方法,但每当我的初始应用程序被删除时,也会删除用于唯一标识的帐户。这是 Account Manager 的默认机制吗?还是我做错了什么?@Taranmeet Singh - AHMED
@AHMED 是的,这是默认机制,但你应该仅在启动应用程序时从帐户管理器中读取数据一次,然后将其保存在应用程序首选项中。如果用户删除了第一个应用程序,则无论何时启动下一个应用程序,请检查帐户管理器是否存在该帐户,如果不存在则使用共享首选项中已有的数据重新创建该帐户。 - Taranmeet Singh
谢谢,我正在尝试实现账户管理器方法,但是当我尝试使用一个构建机安装我的SDK并从多个应用程序中检索数据时,我能够完成任务并从账户管理器中检索数据。然而,当我尝试使用同样的代码从我的同事的构建机(指不同的PC)创建apk时,我遇到了问题,这也是我在使用Android ID时遇到的问题(如果我从同一台构建机/ PC创建apk,则会给出相同的Android ID,如果从不同的构建机运行相同的程序,则会给出不同的Android ID)。 - AHMED
当我从同事的构建机安装apk构建时,它抛出错误:“错误:java.lang.SecurityException:uid 10415无法显式添加类型为com.example.的帐户。”我觉得这可能是由于UID引起的。 - AHMED
嗨@TaranmeetSingh,感谢您的回答!但是,我在实施这种方法时遇到了问题,您能否帮忙看一下。https://dev59.com/hnANtIcB2Jgan1znvmcx - Preet Patel
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接