共享内容提供者

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

它的devise应该牢记以下几点

  • 由任何版本创build的数据应立即在其他版本中可见
  • 据我所知,专业版和免费版本无法在清单文件中声明相同的内容提供者
  • 记住最后一点,我需要为free和pro版本创build单独的提供程序

可能的解决scheme:

  • 创build两个内容提供者,一个由免费版本创build,另一个由专业版本创build
  • 当专业版首次推出时,如果有免费版本的数据,将其复制到专业版
  • 每当有数据写入免费或专业版本,我应该检查是否存在其他版本的内容提供者,如果它们存在,则写入两个内容提供者
  • android:protectionLevel属性设置为“签名”,以便两个版本都可以访问这两个内容提供者

请让我知道这是否合理,并遵循有关共享内容提供商的最佳做法。 请分享任何其他方式来做到这一点。

Solutions Collecting From Web of "共享内容提供者"

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

如果您希望启用/禁用某些function,则可以根据软件包名称在Shared lib中添加相关的检查。

在您的代码中(在共享库中),您可以根据调用包区分Free或Paid和启用/禁用function。

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

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

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

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

结果:

  • 这两个版本现在可以安全地隐式访问其他内容提供者
  • 当付费版本启动时,它会静静地将所有数据从免费版本复制到付费版本,以备无缝使用

只是我的想法。

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

这个方法很好。 但是我看到了一个问题。

内容提供商随着时间的推移而发生什么变化? 假设你决定用更多的字段来增强内容提供者。 然后用户应该升级两个版本,以便正确写入数据。

内容提供者是否会一直保持不变? 如果你决定付费版本将有更多的function,因此捕捉更多的数据。