在多个Android应用之间共享数据

时间:2012-11-07 00:55:55

标签: java android

我正在编写适用于Android的SDK,许多不同的应用都会使用它。每个应用程序都需要知道以前是否安装了另一个使用SDK的应用程序;第一个将创建一个随机ID(一个cookie)并存储它,所有后来的应用程序必须读取它并重用它。请注意,将为每个设备重新创建cookie。

我找了很长时间才得到答案;请在回答之前仔细阅读,因为我已经阅读了很多不同的StackOverflow答案并且已经在互联网上阅读随机博客;我尝试过很多东西,但都没有用(我会保存链接)。

  • ContentProvider肯定是矫枉过正的。此外,它还需要侵入应用程序的AndroidManifest.xml,这是我想要避免的。
  • 同样对于服务:需要在AndroidManifest.xml中定义,我无法控制,也不想要求更改。
  • 使用外部存储可能是一种选择,但我不想要额外的权限。
  • 直接在SharedPreferences上使用getSharedPreferences()无效,因为应用只能访问自己的偏好设置。
  • 我可以使用createPackageContext(package, MODE).getSharedPreferences()获取公共偏好设置对象。如果我有一个主程序包和许多数据客户端,这将很好地工作,但实际上我不知道将首先安装的应用程序包 - 它可以是任何一个。我甚至没有要搜索的包名列表。传递尚未安装的软件包名称会失败。
  • 按照上面的方法,我试图捎带一些我可以信赖的标准Android应用程序,并将我的偏好存储在那里 - 比如说:

    createPackageContext(
        "com.android.browser",
        Context.CONTEXT_RESTRICTED)
        .getSharedPreferences(
            "GLOBAL_PREFS",
            Context.MODE_WORLD_READABLE);
    

    但它不起作用:错误读取

    Couldn't create directory for SharedPreferences file
      /data/data/com.android.browser/shared_prefs/GLOBAL_PREFS.xml
    

所以,回顾一下:我需要在一些标准位置存储一段数据(一个短字符串),这样任何其他应用程序都可以去那里读取它(如果存在的话),如果可能的话它应该可以工作而不做AndroidManifest.xml中的任何魔法或请求任何权限。

可能没有任何完美的答案,所以也许最好的解决方案是写入外部存储;那就这样吧。为了把事情放到上下文中,显然在iOS上使用设计用于存储安全数据的钥匙串来做这件事是微不足道的。

1 个答案:

答案 0 :(得分:2)

不幸的是,我知道的确没有很好的答案。您已经提出了很好的选项轮廓,最好的方法可能是外部存储。

只是为了抛出一些东西,我想你可以使用一个具有固定名称和世界可读(并且可能是可写)权限的平面文件。然后,您必须遍历所有应用程序的目录,并检查每个文件夹中的这个已知命名文件并尝试打开它。

虽然这可能在理论上有效,但请考虑卸载包含“cookie”的应用程序的情况。那你就没有了。您可能希望在每个应用程序中创建cookie,将以前cookie的值复制到新cookie。

我实际上没有尝试过这个,但我认为它应该可行。