在我的一个应用程序中,我想提供一项功能作为仅 20 次尝试的试用。一旦用户第 21 次尝试访问该功能,系统将提示他/她进行应用内购买。
我的问题是如何使这个变量持久化,以便即使用户卸载应用程序并重新安装,计数器也不会重置并采用卸载前的最后一个值。
请帮忙。
在我的一个应用程序中,我想提供一项功能作为仅 20 次尝试的试用。一旦用户第 21 次尝试访问该功能,系统将提示他/她进行应用内购买。
我的问题是如何使这个变量持久化,以便即使用户卸载应用程序并重新安装,计数器也不会重置并采用卸载前的最后一个值。
请帮忙。
最简单的方法是使用 Backup API 并在线备份您的数据。它非常易于使用,这里是教程:
http://developer.android.com/training/cloudsync/backupapi.html
这种方法的缺点是用户可以在手机设置中禁用备份。
另一种方法要求您将数据发送到服务器。我建议使用 parse.com,因为它不需要您编写任何服务器代码,他们有非常易于使用的 Android 库,而且他们的免费计划非常慷慨。这是一个小教程: https ://parse.com/tutorials/get-started-with-android
每次用户触发您的试用功能时,您都可以向云端发送某种唯一 ID(特定于设备或帐户)和计数器。您还可以在应用程序首次启动时从云端查询您的计数器。
要创建该唯一 ID,您可以使用以下几种方法:
尝试获取设备首次启动时生成的 64 位唯一编号:
String androidID = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);
请注意,据报道,对于某些设备,此值可能为空。您可以验证您的 androidID 变量,如果它为空,您可以尝试另一种方法来访问用户的主电子邮件(您可能希望在将其发送到服务器之前对其进行哈希处理)。还要确保向清单文件添加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
}
}
如果无法获取电子邮件 - 您可能还想尝试从电话管理器获取设备 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权限)
希望它为您提供了足够的信息来将试用功能添加到您的代码中。
此外,如果您的应用内购买实际上是订阅,那么 Google 已经为您实施了试用功能:http: //developer.android.com/google/play/billing/billing_subscriptions.html (搜索免费试用)
如果用户卸载或重新安装应用程序,您将无法在本地维护任何内容。
如果您需要卸载/重新安装要求,这是需要在您的后端而不是设备上登录的计数器。您可以通过将设备的 ID存储在您的服务器上并在适当的时候增加您的代码来做到这一点。
我只是定义了一个可序列化的 Expiration 对象,我将其存储到 SD 中,并在其前面添加一个点以使其隐藏。
该对象包含创建时间和其他元数据。
当应用程序启动时,它会检查 Expiration 是否存在,如果不存在则创建。这样,尽管卸载/重新安装,我总是知道安装应用程序的确切时间。
这种方法的缺点是它需要某种外部存储,因为我们想要超出内部存储的标准应用程序文件夹,卸载时会被擦除。
为了避免这种情况,您可以寻找某种方法来获取/给予设备一个唯一 ID,重新安装后保持不变,并将数据上传到服务器。这样做的好处是用户也不能通过擦除 SD 来重置过期时间。