在Android应用中保留持久变量

时间:2013-10-01 21:33:35

标签: android

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

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

请帮忙。

3 个答案:

答案 0 :(得分:2)

最简单的方法是使用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);

请注意,据报道,对于某些设备,此值可能为null。您可以验证您的androidID变量,如果它是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
    }
}

如果无法获得电子邮件 - 您可能还想尝试从电话管理器获取设备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 (搜索免费试用

答案 1 :(得分:0)

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

如果您需要卸载/重新安装要求,这是需要在后端而不是在设备上记录的计数器。您可以通过在服务器上存储device's id并在适当的时候递增代码来实现此目的。

答案 2 :(得分:0)

我只是定义一个可序列化的Expiration对象,我将它存储到SD,前面有一个点,使其隐藏。

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

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

这种方法的缺点是它需要某种外部存储,因为我们想要超出内部存储的标准应用程序文件夹,这在卸载时会被删除。

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