9

我的应用程序有两个版本,免费版和专业版,应用程序数据的内容提供程序需要在两者之间共享。

设计时应牢记以下几点

  • 任何版本创建的数据都应该立即在另一个版本中可见
  • 据我了解,专业版和免费版都不能在清单文件中声明相同的内容提供者
  • 记住最后一点,我需要为免费版和专业版创建单独的提供程序

可能的解决方案:

  • 创建两个内容提供者,一个由免费版创建,另一个由专业版创建
  • 首次启动专业版时,如果免费版中有数据,请将其复制到专业版
  • 每当在免费版或专业版中写入任何数据时,我都应该检查是否存在其他版本的 Content Provider,如果存在则写入两个 Content Provider
  • 将 android:protectionLevel 属性设置为“signature”,这样两个版本都可以访问两个 Content Providers

请让我知道这是否有意义并遵循有关共享内容提供者的最佳实践。请分享任何其他方法。

4

3 回答 3

4

我在市场上有 3 个应用程序,每个应用程序都有免费和付费版本。对于给定的应用程序,我在免费和付费项目都引用的 Android 共享库项目中有 100% 的代码。这些免费和付费的 Android 项目只是虚拟项目,仅对其 AndroidManifest.xml 有用。

如果您希望启用/禁用某些功能,您始终可以根据包名称在共享库中添加相关检查。

在您的代码中(在共享库中),您可以区分免费或付费,并根据调用包启用/禁用功能。

if ("com.example.paid".equals(context.getPackageName()) {
    //enable pro version features
}

你不能做类似的事情吗?这将为您节省大量维护开销。

于 2013-03-07T06:39:15.827 回答
4

所以这就是我最终做的事情:

  • 为每个版本创建了两个单独的内容提供者(每个都有一个单独的权限)并唯一声明它们
  • 将他们的"android:exported"设置为"true"以启用跨应用程序共享内容提供者数据
  • 为每个内容提供者定义了一个自定义权限(具有读+写访问权限)以限制对数据的访问
  • 对于每个权限定义,我将“android:protectionLevel”属性定义为“signature”,以便我的应用程序可以隐式且安全地相互通信
  • 在任何给定版本中,然后我使用 uses-permission android:name="MY_CUSTOM_PERMISSION 元素明确要求访问其他版本中的内容提供程序

结果:

  • 两个版本现在都可以安全隐式地访问彼此的内容提供者
  • 当付费版本启动时,它会默默地将免费版本的所有数据复制到付费版本,以备无缝使用
于 2013-03-07T12:11:15.420 回答
1

只是我的想法。

是否真的需要在设备中同时安装免费和付费版本?如果没有,您只需在用户首次启动付费版本时提供从免费到付费的复制功能。然后用户可以删除免费版本并专门使用付费版本。

方法很好。但我发现它有一个问题。

当内容提供者随时间变化时会发生什么?假设您决定使用更多字段来增强内容提供程序。然后用户应该升级两个版本,以便正确写入数据。

随着时间的推移,这两个内容提供商会保持不变吗?如果您决定付费版本将具有更多功能,从而捕获更多数据怎么办。

于 2013-03-07T00:30:31.193 回答