如何在不丢失用户数据的情况下从免费升级到商用

时间:2013-03-20 17:03:35

标签: android

我正在开发一个分为两个版本的应用程序:免费广告和付费,没有广告。作为广告存在的一部分,应用程序完全相同。

通常认为用户可以获得免费版本,然后 - 如果他们愿意 - 升级到商业版本。

当我将应用上传到Google Play时,我必须使用新的唯一ID创建一个全新的应用。换句话说,同一应用程序的这两个版本实际上是两个完全不同的项目,而且,正如我所见,没有办法避免这种情况。

这是有道理的,只要我必须监控哪个应用程序为我提供了哪些收入。

但是 - 现在出现问题 - 当用户决定从免费版升级到商业版时,我希望他保留所有本地数据。显然,只要两个应用程序具有不同的名称,就不会发生这种情况。

这个问题有一个简单的解决方案吗?

谢谢。

1 个答案:

答案 0 :(得分:3)

当用户从免费版升级到付费版时,如何在免费和付费应用之间共享数据

这是一个非常普遍的问题,包括以下各种问题:

  • 当用户安装 AND RUNS 付费应用时,所有用户数据都应该是 从免费应用程序复制。
  • 如果用户在完成后尝试使用免费应用程序 升级到付费后,他应该自动重定向到付费 应用
  • 当用户删除付费应用时,应该允许免费应用继续以前工作。

最简单的解决方案是维护必须在数据库中共享的所有数据,而不是用户首选项。然后,当第一次运行付费应用程序时,数据库文件可以从免费应用程序复制到付费应用程序。

我发现这对我来说比内容提供商更好,因为所有特殊用例条件都只涉及一次安装一个或另一个或两个应用程序。

为了使这个系统有效,必须有几个关键工具:

  • 应用程序必须能够检测是否安装了彼此 运行时。
  • 应用程序必须知道对方保存数据库的位置 文件。
  • 必须在数据库文件中保存几个标志以指示内容 已经发生了。

如何确定是否已安装其他应用

final String packageName = "com.company.other-app-name";
android.content.pm.PackageManager pm = getPackageManager();
PackageInfo info = pm.getPackageInfo(packageName, 0);

如果抛出info==nullNameNotFoundException,则表示未安装该应用。

如何复制数据库文件

您的数据库文件存储如下:

paidDb = "/data/data/<paid-app-package-name>/databases/<db-name>.db"
freeDb = "/data/data/<free-app-package-name>/databases/<db-name>.db"

您的复制功能应在这些文件上打开FileInputStreamFileOutputStream个对象,并通过任意数量的标准方法复制它们:

while ((length = fis.read(buffer))>0) {
    fos.write(buffer, 0, length);
}

这应该提供您需要的所有工具,以便允许付费应用确定是否安装了免费应用,如果已安装,则复制数据库并从那里继续。免费应用程序应检查是否已安装付费应用程序。如果是这样,请退出友好警告或重定向到付费应用,如下所示:

android.content.pm.PackageManager pm = getPackageManager();
final Intent intent = pm.getLaunchIntentForPackage(packageName);
startActivity( intent );
finish();

可选删除免费应用

付费应用检测到免费应用并复制数据库后,您可以选择让用户删除免费应用,如下所示:

Uri uri = Uri.parse("package:<free-app-package-name>");
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
startActivityForResult(intent, REQUEST_CODE_UNINSTALL_FREE_APP);

注意:您无法保证用户将按要求实际卸载免费应用。使用值REQUEST_CODE_UNINSTALL_FREE_APP,以便当您从付费应用的onActivityResult()中的卸载程序返回时,可以检查用户是否已完成删除。然后,如果卸载没有发生,你可以提供通常的“你确定吗?”还是'再试一次?'对话甚至让他全部变得严肃(不推荐)并迫使他完成卸载,然后再允许他继续使用新的付费应用。

进一步考虑

  • 您的所有共享代码都应位于Android LIbrary Project和。{ 每个应用程序应该是使用的轻量级包装器项目 共享库。这三个项目都将在一个Eclipse中 工作区。
  • 考虑使用Android License Verification Library (LVL) 付费应用程序项目(图书馆计划不需要LVL) 或免费的应用程序)。
  • 还考虑废弃所有这些想法,只制作一个 应用程序,并使用In-app Billing从免费升级到付费。 这超出了这个问题的范围。