每个用户在Android中有唯一的ID

11
我希望能为每个安装应用的用户分配唯一的ID,这样每当应用与服务器通信时,我就知道是谁在联系我。 为此,我想在首次安装时,应用会联系服务器并获取唯一的ID。但我不知道在哪里永久存储该ID,以便下次启动应用程序时,它知道自己的ID,而无需再次联系服务器。 抱歉如果这是一个显而易见的问题,因为我是新手。

1
你不选择使用用户名/密码的原因是什么?如果用户有多个设备和/或更换了他们的Android设备,您将无法知道他们是否是同一人。 (不是说在这种情况下这样做不正确,但这种情况到底是什么呢? :) - Joachim Isaksson
1
顺便提一句,在所有关于唯一ID的重复问题中,这似乎是最权威的之一:https://dev59.com/V3E85IYBdhLWcg3wbS1h,尽管它没有考虑我在答案中提到的注意事项。 - EboMike
我想追踪用户的活动并将其发送到服务器。因此,每当客户在我的网站上输入该唯一ID时,他将能够查看与该用户相关联的日志。这就是为什么我不希望他拥有登录ID,因为应用程序始终会在后台运行。 - Gaurav
问题是重复的,尝试这个解决方案:https://dev59.com/IFYN5IYBdhLWcg3w4br1#49400168 - Bingerz
4个回答

9

这个问题在Stack Overflow上已经被问了很多次。

简而言之:Android一直支持唯一的ID。但是,在Android 2.2之前,某些类型的手机上的ID并不总是相同的。由于现在2.2已经非常普及,我会使用那个ID。

Android开发者博客有一篇好文章介绍了这个问题。

正如Joachim所说,您可能需要考虑完全不同的方法。 Android的唯一ID很好,并且在恢复出厂设置后仍然有效,但在设备升级后无效。还要记住,许多人有多个设备(如手机和平板电脑)。您可能需要改用Google帐户,AccountManager可以帮助您实现。


如何为此添加安全性?如果恶意应用程序安装在该手机上并且可以读取此android_id,则可以轻松使用此id开始调用我的api,因此我引入了一个身份验证令牌...但我需要帮助确定如何确保我生成的密码只能由此设备上的我的应用程序生成,并且我可以在服务器端验证它...在代码中硬编码密钥是不好的做法。 - Anurag Dalia

2

使用SharedPreferences存储唯一标识符。

这是一个例子:

Android SharedPreferences

对于更复杂的数据,您可以使用SQlite。


我正在考虑在服务器上使用用户的设备ID或其他ID生成随机ID。问题是将随机ID存储在设备上。所以问题解决了。谢谢 :) - Gaurav
SharedPreferences不会在用户重新安装、恢复出厂设置或仅清除应用数据操作后存活。您可能希望将其备份到用户的Google帐户上,但它仍然可以轻松删除。 - A.J.

1

对于唯一标识符,您可以使用将安装应用程序的设备的IMEI。请参阅this link以了解如何获取IMEI号码。然后将该IMEI号码存储在共享首选项中。请参考Guillermo lobar的链接。当您的应用程序启动时,需要在首选项中检查该唯一标识符。在第一次使用时,请将其保存在首选项中。因此,当下一次检查该ID时,应用程序会在首选项中找到它,因此无需连接服务器。 :)


@EboMike 感谢你让我注意到这个。 - Ravi Bhatt
@Gaurav 在平板电脑的情况下,只有3G平板电脑才有IMEI。但是通过我在答案中提供的链接,您也可以找到平板电脑的deviceId,这是唯一的。而且,您还可以使用ANDROID_ID作为唯一标识符。请参考[https://dev59.com/0l3Va4cB1Zd3GeqPEub5]。但是根据此链接的答案,它并不是非常可靠。 - Ravi Bhatt
该应用的目标用户仅限于移动用户。因此,我认为它可能会有所帮助。 - Gaurav
IMEI通常是好的,但并非总是如此:http://android-developers.blogspot.co.il/2011/03/identifying-app-installations.html - android developer

0

您可以获取设备的IMEI。从API 26开始,getDeviceId()已被弃用。如果您需要获取设备的IMEI,请使用以下方法:

 String deviceId = "";
    if (Build.VERSION.SDK_INT >= 26) {
        deviceId = getSystemService(TelephonyManager.class).getImei();
    }else{
        deviceId = getSystemService(TelephonyManager.class).getDeviceId();
    }

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