2013-10-01 56 views
0

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

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

请帮忙。

回答

2

最简单的方法是使用备份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允许添加到您的清单)

希望它能给你足够的信息可将试用功能添加到您的代码中。

另外,如果您的应用程序内购买实际上是一个订阅,那么谷歌已经实施审判功能为您提供: http://developer.android.com/google/play/billing/billing_subscriptions.html (搜索免费试用

+0

对不起,我回来这么晚。最后决定去备份选项。如果这工作正常,那么确定,否则将尝试使用第二个选项保存在Parse.com – Abhishek

0

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

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

0

我简单地定义了一个序列化的Expiration对象,我将它存储为SD,并在其前面加上一个点来隐藏它。

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

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

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

为了避免这种情况,您可以寻找某种获取/给予设备唯一ID的方法,在重新安装后保持不变,并将数据上传到服务器。这具有用户不能通过擦除SD来重置到期的优点。

相关问题