共享内容提供者

9

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

设计时应考虑以下几点:

  • 任何版本创建的数据都应立即在另一个版本中可见
  • 据我所知,免费和专业版都不能在清单文件中声明相同的内容提供程序
  • 考虑到上述要点,我需要为免费版和专业版创建单独的提供程序

可能的解决方案:

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

请告诉我这是否符合共享内容提供者的最佳实践,并且易于理解。请分享其他的做法。


我认为你的方法很好。对于写得好的问题,加1。 - AAnkit
3个回答

5

所以这是我最终做的:

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

结果:

  • 现在,两个版本都可以安全、隐式地访问彼此的内容提供者
  • 当付费版本启动时,它会悄悄地将所有数据从免费版本复制到付费版本,以便顺畅使用

我想做类似的事情,但是它没有起作用。你能告诉我你是否使用相同的密钥别名签署了两个版本,还是只使用相同的密钥库? - Tim Autin

4
我在市场上有3个应用程序,每个应用都有免费和付费版本。对于一个给定的应用程序,我在Android共享库项目中拥有100%的代码,该项目被免费和付费项目所引用。这些免费和付费的Android项目只是虚拟项目,仅对其AndroidManifest.xml有用。
如果您想启用/禁用某些功能,您可以始终在共享库中根据软件包名称添加相关检查。
在您的代码(在共享库中),您可以区分免费或付费,并根据调用包启用/禁用功能。
if ("com.example.paid".equals(context.getPackageName()) {
    //enable pro version features
}

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


哇,非常有趣的方法,Asim :) 你在这两个版本之间共享内容提供者吗? - Soham
我没有内容提供者,但是你可以在相应的清单中为内容提供者定义一个单独的权限,并在共享库中的CP代码中“添加”这两个权限。 - AAP

1

这只是我的想法。

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

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

当内容提供商随着时间的推移而更改时会发生什么?假设您决定通过增加几个字段来增强内容提供商。那么用户应该升级两个版本,以便数据正确写入。

两个内容提供商会随着时间的推移保持不变吗?如果您决定付费版本将具有更多功能,因此将捕获更多数据,那会怎样呢?


好的观点,但我计划保持两个数据库的模式相同,从而减少复杂性。在这种情况下,免费版本要么使用整个数据库的子集,要么付费版本将知道需要从免费版本中提取哪些特定数据。 - Soham
两个想法:如果数据库随时间改变(包括免费和付费),拉取(或推送)数据的同步机制必须与所有未来版本兼容。因为用户可能正在使用旧版的免费版但使用更新版的付费版。那么这是否值得开销呢?接下来,假设付费版本拥有位置信息,而免费版本则没有。用户期望在付费应用中可用于内容的位置信息不受其是通过免费还是付费添加的影响。但是,如果在付费版本中看到通过免费版本添加的内容,则位置信息将不可用。 - Gautham
好的,我不会提供定期免费到付费同步功能,只是像你最初的回答一样提供一次性的桥接。 - Soham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接