Android:检索其他应用程序的共享首选项

Swa*_* EP 30 android shared preferences

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

谢谢,斯瓦蒂

小智 50

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

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

并在Application 2中使用此代码从Application 1中的Shared Preferences获取数据.我们可以得到它,因为我们在应用程序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());
            }
Run Code Online (Sandbox Code Playgroud)

更多信息,请访问以下URL: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",还可以访问其他应用程序,我不想要.也许这些信息对某些人来说也很有用. (12认同)
  • 对不起,看起来不小心我点击了你的答案的"向下投票",现在无法撤消这个,除非你编辑你的回复.如果可以的话,请至少进行最低限度的编辑,以便我可以对其进行投票...再次,抱歉我的错误,随意的意外点击. (4认同)
  • 这是一个很好的答案,@ KingAlex1985添加允许我的付费应用程序阅读它的免费兄弟的共享偏好,而不会暴露给世界.也可以使用'PreferenceManager.getDefaultSharedPreferences(con)'.我在两个应用程序中添加了"android:sharedUserId"和"android:sharedUserLabel". (2认同)

jkh*_*uw1 24

假设首选项是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());
}
Run Code Online (Sandbox Code Playgroud)

  • 自 API 级别 17 起,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 模式已被弃用。自 API 级别 24 起,这些模式将抛出 SecurityException:https://developer.android.com/training/data-storage/shared-preferences#java (3认同)
  • 您可以在其他应用程序(拥有首选项的应用程序)中执行此操作.从你提出的问题来看,你似乎无法访问,因为如果你这样做,你就会知道可用的密钥.但是你使用mode_world_readable以类似的方式完成它.这是一种非常糟糕的做事方式,如果你想分享数据,你应该遵循commonsware建议 (2认同)

Kho*_*aib 10

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


And*_*der 9

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

这个常量在API级别17中被折旧.创建世界可读文件非常危险,并且可能在应用程序中造成安全漏洞.强烈劝阻; 相反,....等

由于折旧,在具有共享偏好的应用之间实现文件共享可能风险太大,尽管它很简单.我不太关心游戏应用程序中MODE_WORLD_READABLE模式的安全漏洞,我只想将角色从一个应用程序转移到另一个应用程序.他们贬低两种共享模式太糟糕了.


sak*_*liu 5

如果我们想要来自其他app/pkg/process的读取权限值,它可以工作.但是jkhouw1的回答有些不对劲:

Context myContext = createPackageContext("com.example", 
            Context.MODE_WORLD_WRITEABLE);
Run Code Online (Sandbox Code Playgroud)

它应该是 :

Context myContext = createPackageContext("com.example", 
            Context.CONTEXT_IGNORE_SECURITY);
Run Code Online (Sandbox Code Playgroud)

虽然,CONTEXT_IGNORE_SECURITY和MODE_WORLD_WRITEABLE具有相同的"int 2"值,完全归功于这个问题和答案.