【问题标题】:Shared Content Provider共享内容提供者
【发布时间】:2013-03-06 17:38:37
【问题描述】:

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

在设计时应牢记以下几点

  • 任何版本创建的数据都应立即在其他版本中可见
  • 据我了解,专业版和免费版都不能声明same content provider in the manifest file
  • 记住最后一点,我需要为免费版和专业版创建单独的提供程序

可能的解决方案:

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

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

【问题讨论】:

  • 我认为你的方法很好。 +1 写得很好的问题

标签: android android-contentprovider


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 哇,非常有趣的方法 Asim :) 你在两个版本之间共享一个内容提供者吗?
  • 我没有内容提供者,但您可以在各自的清单中为内容提供者定义单独的权限,并在共享库中的 CP 代码中“添加”这两个权限
【解决方案2】:

这就是我最终做的事情:

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

结果:

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

【讨论】:

  • 我想做类似的事情,但它不起作用。您能告诉我您是使用相同的密钥别名还是仅使用相同的密钥库签署了您的两个版本?
【解决方案3】:

只是我的想法。

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

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

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

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

【讨论】:

  • 好点,但我计划保持两个数据库的架构相同,从而降低复杂性。在这种情况下,免费版本将使用整个数据库的子集,或者付费版本将知道需要从免费版本中提取哪些特定数据。
  • 2 想法:如果数据库随时间变化(免费和付费),拉取(或在此处推送数据)同步机制必须与所有未来版本兼容。由于用户可能正在使用旧版本的免费但新版本的付费。那么开销值吗?接下来,假设付费版本有位置,但免费版本没有。用户希望该位置可用于付费应用程序中的内容,无论是通过免费还是付费输入。但如果用户在付费版本中看到通过免费添加的内容,则位置将不可用。
  • 好点。我不会使用定期免费到付费同步功能,只是像您最初的回答那样在两者之间建立一次性桥梁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 2012-04-05
  • 1970-01-01
相关资源
最近更新 更多