2

我正在开发一个以两个版本分发的应用程序:免费有广告和付费无广告。由于广告的存在,这些应用程序完全相同。

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

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

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

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

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

谢谢你。

4

1 回答 1

3

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

这是一个非常常见的问题,充满了各种各样的问题,包括以下问题:

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

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

我发现这对我来说比内容提供程序更有效,因为所有特殊用例条件都与在任何时候仅安装一个或另一个或两个应用程序有关。

为了使该系统正常工作,必须具备几个关键工具:

  • 应用程序必须能够检测彼此是否在运行时安装。
  • 应用程序必须知道其对应方将其数据库文件保存在何处。
  • 必须将几个标志保存在数据库文件中以指示发生了什么。

如何确定是否安装了其他应用程序

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

如果抛出info==nullor NameNotFoundException,则未安装该应用程序。

如何复制数据库文件

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

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 项目中,并且每个应用程序都应该是使用共享库的轻量级包装器项目。所有三个项目都将位于一个 Eclipse 工作区中。
  • 考虑为付费应用项目使用Android 许可证验证库 (LVL)(对于库项目或免费应用,您不需要 LVL)。
  • 还可以考虑放弃所有这些想法,只制作一个应用程序,并使用应用内计费从免费升级到付费。这远远超出了这个问题的范围。
于 2013-03-20T18:18:51.293 回答