我正在为 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 上使用钥匙串来做到这一点是微不足道的,钥匙串旨在存储安全数据。