3

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

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

  • ContentProvider 绝对是矫枉过正。它还需要侵入应用程序AndroidManifest.xml,这是我试图避免的。
  • 同样对于服务:需要在 中定义AndroidManifest.xml,我无法控制并且不想要求对其进行更改。
  • 使用外部存储可能是一种选择,但我不想要求额外的权限。
  • SharedPreferences直接使用withgetSharedPreferences()不起作用,因为应用程序只能访问自己的首选项。
  • 我可以使用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 上使用钥匙串来做到这一点是微不足道的,钥匙串旨在存储安全数据。

4

1 回答 1

2

Unfortunately there really isn't a great answer for this that I know of. You've come up with a pretty good outline of your options and the best way may well be with external storage.

Just to throw something out there, I suppose it's possible you could use a flat file with a fixed name and world readable (and possibly writable) permissions. You'd have to then iterate through all applications' directories and check for this known-named file in each folder and attempt to open it.

While this might work theoretically, consider the case where the app that contains the "cookie" is uninstalled. Then you're left cookie-less. You might want to create the cookie in every app, copying over the value of the previous cookies to new cookies.

I haven't actually tried this, but I imagine it should work.

于 2012-11-07T02:02:50.813 回答