在Android应用程序中保留持久变量

在Android应用程序中保留持久变量,android,Android,在我的一个应用程序中,我想试用一个功能,只需20次。一旦用户想要访问该功能进行第21次尝试,他/她将被提示进行应用内购买 我的问题是如何使此变量保持不变,以便即使用户卸载应用程序并重新安装,计数器也不会重置,并获取卸载前的最后一个值 请提供帮助。如果用户卸载或重新安装应用程序,您无法在本地为其维护任何内容 如果您需要卸载/重新安装要求,这是需要登录到后端而不是设备上的计数器。您可以通过将存储在服务器上并在适当时增加您的股票代码来实现这一点。我只需定义一个可序列化的过期对象,将其存储到SD,并在其

在我的一个应用程序中,我想试用一个功能,只需20次。一旦用户想要访问该功能进行第21次尝试,他/她将被提示进行应用内购买

我的问题是如何使此变量保持不变,以便即使用户卸载应用程序并重新安装,计数器也不会重置,并获取卸载前的最后一个值


请提供帮助。

如果用户卸载或重新安装应用程序,您无法在本地为其维护任何内容


如果您需要卸载/重新安装要求,这是需要登录到后端而不是设备上的计数器。您可以通过将存储在服务器上并在适当时增加您的股票代码来实现这一点。

我只需定义一个可序列化的过期对象,将其存储到SD,并在其前面加一个点以使其隐藏

对象包含创建时间和其他元数据

当应用程序启动时,它会检查是否存在过期,如果不存在,则会创建。这样,尽管卸载/重新安装了应用程序,但我始终知道安装应用程序的确切时间

这种方法的缺点是它需要某种类型的外部存储,因为我们想要进入内部存储的标准应用程序文件夹之外,卸载时会将其擦除


为了避免这种情况,您可以寻找某种方法获取/赋予设备一个唯一的id,该id在重新安装后保持不变,然后将数据上传到服务器。这样做的好处是,用户也不能通过擦除SD来重置过期时间。

最简单的方法是使用备份API并在线备份数据。它非常易于使用,以下是教程:

这种方法的缺点是用户可以在手机设置中禁用备份

另一种方法要求您向服务器发送数据。我建议使用parse.com,因为它不需要您编写任何服务器代码,他们有非常易于使用的Android库,他们的免费计划非常慷慨。以下是一个小教程:

每次用户触发您的试用功能时,您都可以向云发送某种独特的id(特定于设备或帐户)和计数器。当应用程序第一次启动时,您还可以从云端查询您的计数器

要创建唯一的id,您可以使用以下几种方法:

尝试获取设备首次启动时生成的64位唯一编号:

String androidID = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);
请注意,据报告,对于某些设备,此值可能为空。您可以验证Android变量,如果该变量为null,则可以尝试另一种方法,该方法将允许您访问用户的主电子邮件(您可能希望在将其发送到服务器之前对其进行散列)。 还要确保向清单文件添加android.permission.GET_ACCOUNTS权限:

final Account[] accounts = AccountManager.get(context).getAccounts();
for (final Account account : accounts) {
    if (Patterns.EMAIL_ADDRESS.matcher(account.name).matches()) {
        final String email = account.name;
        // hash email and use it
    }
}
如果无法获取电子邮件-您可能还希望尝试从telephony manager获取设备id:

// For CDMA phone getDeviceId() is equal to value request for Secure.ANDROID_ID
final TelephonyManager telMgr = (TelephonyManager)getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
final String deviceId = telMgr.getDeviceId();
(别忘了将android.permission.READ_PHONE_STATE权限添加到清单中)

希望它能为您提供足够的信息,以便在代码中添加试用功能

此外,如果您的应用内购买实际上是订阅,那么谷歌已经为您实施了试用功能:
(搜索免费试用版)

很抱歉这么晚才回来。最后决定选择备份选项。如果可以,那么OK或者会尝试使用Parse.com上保存的第二个选项