当用户从免费版本升级到付费版本时,如何在免费和付费应用程序之间共享数据
这是一个非常常见的问题,充满了各种各样的问题,包括以下问题:
- 当用户安装并运行付费应用程序时,所有用户数据都应从免费应用程序中复制。
- 如果用户在完成升级到付费后尝试使用免费应用程序,他应该会被自动重定向到付费应用程序。
- 当用户删除付费应用程序时,应该允许免费应用程序像以前一样继续工作。
最简单的解决方案是维护所有必须在数据库中共享的数据,而不是用户首选项。然后,当付费应用程序第一次运行时,可以将数据库文件从免费应用程序复制到付费应用程序。
我发现这对我来说比内容提供程序更有效,因为所有特殊用例条件都与在任何时候仅安装一个或另一个或两个应用程序有关。
为了使该系统正常工作,必须具备几个关键工具:
- 应用程序必须能够检测彼此是否在运行时安装。
- 应用程序必须知道其对应方将其数据库文件保存在何处。
- 必须将几个标志保存在数据库文件中以指示发生了什么。
如何确定是否安装了其他应用程序:
final String packageName = "com.company.other-app-name";
android.content.pm.PackageManager pm = getPackageManager();
PackageInfo info = pm.getPackageInfo(packageName, 0);
如果抛出info==null
or 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()
付费应用程序的卸载程序返回时,您可以检查用户是否完成了删除。然后,如果卸载没有发生,您可以提供通常的“您确定吗?” 或“再试一次?” 对话甚至对他采取严厉措施(不推荐)并强迫他完成卸载,然后再允许他继续使用新的付费应用程序。
进一步考虑: