Java 在多个Android应用程序之间共享一段数据

Java 在多个Android应用程序之间共享一段数据,java,android,Java,Android,我正在为Android编写一个SDK,它将被许多不同的应用程序使用。每个应用程序都需要知道以前是否安装了另一个使用SDK的应用程序;第一个将创建一个随机id(cookie)并存储它,所有以后的应用程序都必须读取并重用它。请注意,将为每个设备重新创建cookie 我寻找答案已经很久了;在回答之前请仔细阅读,因为我已经阅读了很多不同的答案,并且已经浏览了互联网上的随机博客;我已经尝试了很多东西,但都没有成功(我会保存链接) 一个内容提供者绝对是矫枉过正。它还需要侵入应用程序的AndroidMani

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

我寻找答案已经很久了;在回答之前请仔细阅读,因为我已经阅读了很多不同的答案,并且已经浏览了互联网上的随机博客;我已经尝试了很多东西,但都没有成功(我会保存链接)

  • 一个内容提供者绝对是矫枉过正。它还需要侵入应用程序的
    AndroidManifest.xml
    ,这是我试图避免的
  • 同样,对于服务:需要在
    AndroidManifest.xml
    中定义,我不控制它,也不希望对其进行更改
  • 使用外部存储可能是一种选择,但我不想要求额外的权限
  • SharedReferences
    直接与
    GetSharedReferences()
    一起使用不起作用,因为应用程序只能访问自己的首选项
  • 我可以使用
    createPackageContext(包,模式).getSharedReferences()
    获得一个公共首选项对象。如果我有一个主程序包和许多数据客户端,这将非常有效,但事实上,我不知道将首先安装的应用程序包——可以是其中的任何一个。我甚至没有要搜索的包名列表。传递尚未安装的包名称失败
  • 按照上面的方法,我试着借助一些我可以信赖的标准Android应用程序,将我的偏好存储在那里——比如:

    但它不起作用:错误是

    Couldn't create directory for SharedPreferences file
      /data/data/com.android.browser/shared_prefs/GLOBAL_PREFS.xml
    
因此,概括一下:我需要将一段数据(一个短字符串)存储在某个标准位置,以便任何其他应用程序都可以访问该位置并读取它(如果存在),如果可能的话,它应该可以工作,而无需在
AndroidManifest.xml
中执行任何魔法或请求任何权限


可能没有任何完美的答案,因此最好的解决方案可能是写入外部存储器;那就这样吧。要把事情放在上下文中考虑,显然,在iOS上使用一个旨在存储安全数据的钥匙链来实现这一点并不重要。

不幸的是,据我所知,确实没有一个很好的答案。您已经提出了一个非常好的选项概要,最好的方法可能是使用外部存储

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

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


实际上,我还没有尝试过这个方法,但我想它应该会起作用。

我想补充一点,为了其他可能遇到这种情况的人的利益,在另一个包的上下文中调用GetSharedReferences(..)是一个非常糟糕的主意。android使用SharedReferences对象的缓存,该缓存仅由首选项文件名键入,不考虑包。换句话说,除非您从不使用除自己的上下文之外的任何上下文,否则绝对不能保证您返回的SharedReference实际上与您调用的包上下文相对应。
Couldn't create directory for SharedPreferences file
  /data/data/com.android.browser/shared_prefs/GLOBAL_PREFS.xml