【发布时间】:2011-08-27 04:24:05
【问题描述】:
我有一个设置应用程序,我必须从中检索其他应用程序首选项,但我没有其中键的详细信息,我如何检索该首选项中的所有可用键和值?
谢谢, 斯瓦提
【问题讨论】:
标签: android preferences shared
我有一个设置应用程序,我必须从中检索其他应用程序首选项,但我没有其中键的详细信息,我如何检索该首选项中的所有可用键和值?
谢谢, 斯瓦提
【问题讨论】:
标签: android preferences shared
好的!在应用程序 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
【讨论】:
0 放在createPackageContext 中?
假设首选项是 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());
}
【讨论】:
此外,您必须在两个应用的清单文件中添加相同的 android:sharedUserId。
【讨论】:
不幸的是,文档现在甚至没有解释 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE,而是说:
此常量在 API 级别 17 中已被折旧。 创建世界可读的文件是非常危险的,并且可能会导致应用程序中的安全漏洞。强烈建议不要这样做;相反,...等
自贬值以来,使用 sharedpreferences 在应用程序之间实现文件共享可能风险太大,尽管它很简单。我不太关心游戏应用程序中 MODE_WORLD_READABLE 模式的安全漏洞,我只想能够将角色从一个应用程序传输到另一个应用程序。太糟糕了,他们贬低了这两种共享模式。
【讨论】:
如果我们想从其他 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”值 总之,感谢您提出这个问题和答案。
【讨论】:
将一个应用程序的存储共享首选项数据检索到另一个应用程序很简单。
第 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();
}
【讨论】: