我正在开发一个应用程序,该应用程序有两个版本:免费(有广告)和付费(无广告)。除了广告之外,这些应用程序完全相同。
通常,用户会获得免费版本,然后(如果他们愿意)升级到商业版本。
当我将应用程序上传到 Google Play 时,我必须创建一个全新的应用程序,并具有新的唯一 ID。换句话说,同一应用程序的这两个版本实际上是两个完全不同的项目,而且据我所知,没有办法避免这种情况。
这是有道理的,因为我必须监控哪个应用程序为我提供了哪些收入。
但是 - 现在问题来了 - 当用户决定从免费版本升级到商业版本时,我希望他保留所有本地数据。显然,只要两个应用程序具有不同的名称,这种情况就不会发生。
这个问题有简单的解决办法吗?
谢谢。
最佳答案
当用户从免费版本升级到付费版本时,如何在免费和付费应用之间共享数据
这是一个非常常见的问题,充满了各种各样的问题,包括以下内容:
- 当用户安装并运行付费应用时,所有用户数据都应 从免费应用程序复制。
- 如果用户在完成后尝试使用免费应用程序 升级到付费,他应该会自动重定向到付费 应用程序。
- 当用户删除付费应用时,应允许免费应用像以前一样继续运行。
最简单的解决方案是维护数据库中必须共享的所有数据,而不是用户首选项。然后,当付费应用程序第一次运行时,数据库文件可以从免费应用程序逐字复制到付费应用程序。
我发现这对我来说比内容提供程序更有效,因为所有特殊用例条件都涉及同时安装一个或另一个或两个应用程序。
为了使该系统正常工作,必须部署几个关键工具:
- 应用程序必须能够检测彼此是否安装在 运行时。
- 应用程序必须知道其对应方保存数据库的位置 文件。
- 必须在数据库文件中保存几个标志来指示什么 已经发生了。
如何确定是否安装了其他应用:
final String packageName = "com.company.other-app-name";
android.content.pm.PackageManager pm = getPackageManager();
PackageInfo info = pm.getPackageInfo(packageName, 0);
如果抛出 info==null
或 NameNotFoundException
,则应用程序未安装。
如何复制数据库文件:
您的数据库文件存储如下:
paidDb = "/data/data/<paid-app-package-name>/databases/<db-name>.db"
freeDb = "/data/data/<free-app-package-name>/databases/<db-name>.db"
您的复制函数应打开这些文件上的 FileInputStream
和 FileOutputStream
对象,并通过任意数量的标准方法复制它们,如下所示:
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从免费升级到付费。 这远远超出了这个问题的范围。
关于android - 如何从免费升级到商业而不丢失用户数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530072/