【问题标题】:Android: Retrieving shared preferences of other applicationAndroid:检索其他应用程序的共享首选项
【发布时间】:2011-08-27 04:24:05
【问题描述】:

我有一个设置应用程序,我必须从中检索其他应用程序首选项,但我没有其中键的详细信息,我如何检索该首选项中的所有可用键和值?

谢谢, 斯瓦提

【问题讨论】:

    标签: android preferences shared


    【解决方案1】:

    好的!在应用程序 1 中使用此代码(包名称为“com.sharedpref1”)以共享首选项存储数据。

    SharedPreferences prefs = getSharedPreferences("demopref",
                        Context.MODE_WORLD_READABLE);
                SharedPreferences.Editor editor = prefs.edit();
                editor.putString("demostring", strShareValue);
                editor.commit();
    

    并在应用程序 2 中使用此代码从应用程序 1 中的共享首选项中获取数据。我们可以获取它,因为我们在应用程序 1 中使用了 MODE_WORLD_READABLE:

        try {
                    con = createPackageContext("com.sharedpref1", 0);
                    SharedPreferences pref = con.getSharedPreferences(
                            "demopref", Context.MODE_PRIVATE);
                    String data = pref.getString("demostring", "No Value");
                    displaySharedValue.setText(data);
    
                } catch (NameNotFoundException e) {
                    Log.e("Not data shared", e.toString());
                }
    

    更多信息请访问此网址: http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html

    【讨论】:

    • 这是一个很好的代码:就我而言,起初我没有使用第一个应用程序中的包名称条目。但现在它可以工作了。而不是 App1 中的“Context.MODE_WORLD_READABLE”,我尝试在两个 AndroidManifest.xml 应用程序中将“Context.MODE_PRIVATE”与“android:sharedUserId”和“android:sharedUserLabel”结合使用。我使用这种组合的原因是我只想要我自己开发的应用程序的访问权限。使用“MODE_WORLD_READABLE”也可以访问其他应用程序,这是我不想要的。也许这些信息对某些人也有用。
    • 这是一个很好的答案,并且@KingAlex1985 的添加允许我的付费应用程序读取它的免费兄弟的共享偏好,而不会将它们暴露给世界。也适用于“PreferenceManager.getDefaultSharedPreferences(con)”。我在两个应用程序中都添加了“android:sharedUserId”和“android:sharedUserLabel”。
    • @danhnn.uit 为什么要把0 放在createPackageContext 中?
    • 此外,从安全角度来看,您可以在应用程序 1 中使用一种算法进行加密,然后将其保存在共享首选项中,然后在应用程序 2 中使用解密来访问数据。这将确保您在任何情况下,如果任何其他应用程序可以访问共享偏好数据,那么该应用程序也将无法看到您的敏感数据。
    【解决方案2】:

    假设首选项是 WORLD_READABLE,这可能有效:

    final ArrayList<HashMap<String,String>> LIST = new ArrayList<HashMap<String,String>>();
    // where com.example is the owning  app containing the preferences
    Context myContext = createPackageContext("com.example", Context.MODE_WORLD_WRITEABLE); 
    SharedPreferences testPrefs = myContext.getSharedPreferences("test_prefs", Context.MODE_WORLD_READABLE); 
    Map<String, ?> items = testPrefs .getAll();
    for(String s : items.keySet()) {
      // do something like String value = items.get(s).toString());
    }
    

    【讨论】:

    • 您在另一个应用程序(拥有首选项的应用程序)中执行此操作。从你的问题来看,你似乎无法访问,因为如果你这样做了,你就会知道可用的密钥。但是你可以用与上面类似的方式使用 mode_world_readable 来完成它。这确实是一种非常糟糕的做事方式,如果您想共享数据,则应遵循 commonsware 建议
    • 应用程序需要具有 WORLD_READABLE 模式 - 也许这就是您的意思并输入错误? WOLRD_WRITABLE 表示任何人都可以写入。
    • 我试过了,但我无法从另一个应用程序中读取值
    • 如何更新从其他应用加载的首选项中的值...?
    • MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 模式自 API 级别 17 起已被弃用。自 API 级别 24 起,这些将抛出 SecurityException: developer.android.com/training/data-storage/…
    【解决方案3】:

    此外,您必须在两个应用的清单文件中添加相同的 android:sharedUserId。

    【讨论】:

    • 我们如何在两个应用的清单文件中使用。你能举个例子吗?
    【解决方案4】:

    不幸的是,文档现在甚至没有解释 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE,而是说:

    此常量在 API 级别 17 中已被折旧。 创建世界可读的文件是非常危险的,并且可能会导致应用程序中的安全漏洞。强烈建议不要这样做;相反,...等

    自贬值以来,使用 sharedpreferences 在应用程序之间实现文件共享可能风险太大,尽管它很简单。我不太关心游戏应用程序中 MODE_WORLD_READABLE 模式的安全漏洞,我只想能够将角色从一个应用程序传输到另一个应用程序。太糟糕了,他们贬低了这两种共享模式。

    【讨论】:

      【解决方案5】:

      如果我们想从其他 app/pkg/process 读取偏好值,它可以工作。 但 jkhouw1 的回答有问题:

      Context myContext = createPackageContext("com.example", 
                  Context.MODE_WORLD_WRITEABLE);
      

      应该是:

      Context myContext = createPackageContext("com.example", 
                  Context.CONTEXT_IGNORE_SECURITY);
      

      虽然,CONTEXT_IGNORE_SECURITY 和 MODE_WORLD_WRITEABLE 具有相同的“int 2”值 总之,感谢您提出这个问题和答案。

      【讨论】:

        【解决方案6】:

        将一个应用程序的存储共享首选项数据检索到另一个应用程序很简单。

        第 1 步:在两个应用的清单文件中添加相同的 android:sharedUserId="android.uid.shared"。

        第 2 步:储值应用1

         SharedPreferences preferences = context.getSharedPreferences("token_id",    Context.MODE_WORLD_READABLE);
                Editor editor = preferences.edit();
                editor.putString("shared_token", encryptedValue);
                Log.e("aaa *** shared_token : ", encryptedValue.toString());
                editor.commit();
        

        第 3 步:从应用程序2 中获取价值

        Context con = null;
                try {
                    con = createPackageContext("application2 package name", Context.CONTEXT_IGNORE_SECURITY);
                } catch (PackageManager.NameNotFoundException e) {
                    e.printStackTrace();
                }
        
                try {
                    if (con != null) {
                        SharedPreferences pref = con.getSharedPreferences(
                                "token_id", Context.MODE_WORLD_READABLE);
        
                        String data = pref.getString("shared_token", "");
                        Log.d("msg", "Other App Data: " + data);
                    } else {
                        Log.d("msg", "Other App Data: Context null");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
        

        【讨论】:

          猜你喜欢
          • 2017-11-22
          • 1970-01-01
          • 1970-01-01
          • 2012-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-04
          • 2020-08-18
          相关资源
          最近更新 更多