我正在开发一个分为两个版本的应用程序:免费广告和付费,没有广告。作为广告存在的一部分,应用程序完全相同。
通常认为用户可以获得免费版本,然后 - 如果他们愿意 - 升级到商业版本。
当我将应用上传到Google Play时,我必须使用新的唯一ID创建一个全新的应用。换句话说,同一应用程序的这两个版本实际上是两个完全不同的项目,而且,正如我所见,没有办法避免这种情况。
这是有道理的,只要我必须监控哪个应用程序为我提供了哪些收入。
但是 - 现在出现问题 - 当用户决定从免费版升级到商业版时,我希望他保留所有本地数据。显然,只要两个应用程序具有不同的名称,就不会发生这种情况。
这个问题有一个简单的解决方案吗?
谢谢。
答案 0 :(得分:3)
这是一个非常普遍的问题,包括以下各种问题:
最简单的解决方案是维护必须在数据库中共享的所有数据,而不是用户首选项。然后,当第一次运行付费应用程序时,数据库文件可以从免费应用程序复制到付费应用程序。
我发现这对我来说比内容提供商更好,因为所有特殊用例条件都只涉及一次安装一个或另一个或两个应用程序。
为了使这个系统有效,必须有几个关键工具:
如何确定是否已安装其他应用:
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()
中的卸载程序返回时,可以检查用户是否已完成删除。然后,如果卸载没有发生,你可以提供通常的“你确定吗?”还是'再试一次?'对话甚至让他全部变得严肃(不推荐)并迫使他完成卸载,然后再允许他继续使用新的付费应用。
进一步考虑: