如何在Android应用程序卸载后持久化数据?

5
我以为会有一些简单的解决方案。 要求
唯一标识设备跨应用程序安装/卸载会话。 选项:
  1. 每次需要时使用某种 Android 设备标识符 API(每次从 Android 的 API 中读取)。根据 Identififying-app-installations 博客文章,这不是推荐的可靠解决方案。

  2. 生成 UUID 一次(在第一次启动应用程序时)并将其保留在某个地方,使其在多个应用程序安装/卸载中得以保存。这个“某个地方”部分是一个谜。存储到 SD 卡或云之类的解决方案不可行。iOS 有可以用于此类事情的密钥链,但我没有找到 Android 的等效物。

还有其他选择吗?我更喜欢走(2)路线,因为我的服务器实现方式(如果不存在,则服务器首次生成 UUID)。但如果这不可行,我可以回退到(1)并修改服务器。

谢谢。


1
iOS有钥匙串可以用于这种事情,但我没有找到Android的等效物。当您的应用程序被卸载时,存储在密钥库中的任何内容都将被删除。 "这个“某个地方”部分是个谜。像存储到SD卡或云之类的解决方案都不是选项" - 除了外部存储器之外,没有其他地方可以放置文件以在卸载后保留,并且如果用户选择,用户可以从外部存储器中清除文件。 - CommonsWare
1
请注意,即使应用程序被卸载并重新安装,iOS 仍会在钥匙串中保留其数据。我想知道我是否应该采用(1)这种方式来处理 Android。 - vale4674
你可以使用 Android 设备 ID 来创建会话。每台手机的设备 ID 都是唯一的且不会更改。这样,只要用户不更换设备,就可以保存会话状态。 - Jelle van Es
1个回答

7

为了在应用程序安装/重新安装之间唯一标识一个应用程序,你需要获取它的 硬件ID 并将其用作你的凭据/密钥。

要获取硬件ID,您可以使用以下方法:

public static String getHardwareId(Context context) {
    return Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
}

它与UUID部分等价,但有以下例外:如果设备进行出厂设置,则该值可能会更改。

我称其为“部分等价”的原因是:HardwareID是一个64位数字(以十六进制字符串表示),在用户首次设置设备时随机生成,并应在用户设备的使用寿命内保持不变。如果设备进行出厂设置,则该值可能会更改。 注意:当设备有多个用户(仅适用于运行Android 4.2或更高版本的某些设备)时,每个用户都会显示为完全独立的设备,因此ANDROID_ID值对于每个用户都是唯一的。

但这带来了第二个问题:在哪里以及如何存储它;将其存储在SharedPreferences中是无用的,因为如果卸载应用程序,则该值将被清除。同样,/data/data/your.package.name/my_stored_keys文件夹也会在卸载期间从手机中删除。

如果您希望在卸载和重新安装应用程序之间保留该值,则需要将其保存在服务器端。


注意给读者 - 一般情况下避免使用这个(和HARDWARE_ID),而是生成一个UUID并将其持久化在您的客户端/服务器上。 - Shark

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