【问题标题】:How to read other app's SharedPreferences (same user ID)?如何读取其他应用的 SharedPreferences(相同的用户 ID)?
【发布时间】:2013-08-19 12:14:34
【问题描述】:

在 Android 4.3 上测试。我有两个应用程序,com.my.app.firstcom.my.app.second。在我的活动中,我想从其他应用程序中读取首选项。我选择为我的两个应用使用相同的用户 ID:

android:sharedUserId="com.my.app"

我总是这样加载我的偏好:

prefs = getSharedPreferences("MyAppPreferences", Context.MODE_PRIVATE);

现在,在我的第二个应用程序中,我执行以下操作:

try {
    Context context = createPackageContext("com.my.app.first", Context.CONTEXT_IGNORE_SECURITY);
    // context.getPackageName() does indeed return "com.my.app.first"

    // Note: Context.MODE_WORLD_READABLE makes no difference here!
    prefs = context.getSharedPreferences("MyAppPreferences", Context.MODE_PRIVATE);
}

prefs.mFile 错误地指向/data/data/com.my.app.second/shared_prefs/MyAppPreferences.xml

显然,对getSharedPreferences 的调用会返回当前应用的首选项,即使我使用了其他应用的上下文。我究竟做错了什么?请帮忙!

【问题讨论】:

  • 在您创建 SharedPrefs 的应用程序中,您是否将模式设置为 MODE_WORLD_READABLE ?
  • 不。由于使用的是相同的sharedUserId,因此不需要它。

标签: android sharedpreferences


【解决方案1】:

发现问题了!这看起来像是getSharedPreferences API 中的一个错误。结果表明,previous 调用 getSharedPreferences 导致另一个 context.getSharedPreferences() 调用返回前一个实例 - 当前应用的首选项。

解决方案是确保在读取其他应用的首选项之前调用getSharedPreferences()

【讨论】:

    【解决方案2】:

    只需再次阅读旧上下文即可解决。对我来说听起来也像一个缓存。

    Context tempContext = context.createPackageContext(originalContext.getPackageName(),Context.CONTEXT_IGNORE_SECURITY);
    SharedPreferences sharedInformationM2 = tempContext.getSharedPreferences("sharedInformation", Context.MODE_WORLD_READABLE);
    

    【讨论】:

    • 对我不起作用,这种方法也有同样的问题。
    【解决方案3】:

    您可能希望在 App A MODE_WORLD_READABLE 中创建 SharedPreference,并为 App A 和 App B 使用公共 sharedUserId。如链接中所述,

    http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html

    【讨论】:

    • 谢谢,但MODE_WORLD_READABLE 不是让所有 应用程序都可以读取首选项吗?我认为sharedUserId 的目的是允许读取私人数据。
    • 这是关于MODE_PRIVATE的文档所说的: 文件创建模式:默认模式,创建的文件只能由调用应用程序(或共享同一用户的所有应用程序)访问ID)。这就是我发布问题的原因。
    • Right MODE_WORLD_READABLE 本质上使它对所有应用程序都是可读的,而我对 sharedUserId 的不好,而不是我的意思是在调用时使用唯一名称,例如 context.getSharedPreference("unique", MODE) . developer.android.com/reference/android/content/…, int)
    • 你说过你在这里使用 prefs = context.getSharedPreferences("MyAppPreferences", Context.MODE_PRIVATE),并将 Desired Name 作为 MyAppPreference,这将导致系统为此应用程序创建一个新的共享首选项文件.理想情况下,它应该与其他应用程序在创建时使用的相同。
    • 我用谷歌搜索了这个,一些来源显示了我的代码 sn-p。即使我正在使用其他应用程序的上下文,它会创建一个新文件吗?没有意义。
    【解决方案4】:

    由于您的两个应用程序都在运行,您还可以通过设置共享首选项来解决此问题:

    tempContext.getSharedPreferences("sharedInformation", Context.MODE_MULTI_PROCESS);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      相关资源
      最近更新 更多