我一直在开发一个Android应用程序,它通过共享偏好文件与设备上安装的其他应用程序进行交互。
此文件创建为MODE.WORLD_READABLE,并且每个已安装的应用程序都有自己的文件,该文件具有公共定义的名称和属性(该特定属性的值有哪些更改)。
例如,AppA和AppB应该每个都有一个名为" app_shared_file.xml"的共享文件。使用属性" property_shared_file"。
从我的应用程序中我想首先访问此文件并读取该属性值,并根据该结果我想创建/更新我的。
尽管如此,我在实现这一目标方面遇到了一些问题。在Android文档中,我看到:
检索并保存首选项文件' name'的内容, 返回一个SharedPreferences,你可以通过它检索和 修改其值。 只有SharedPreferences对象的一个实例 返回给任何同名的呼叫者,这意味着他们会看到 彼此编辑后立即进行编辑。
在阅读其他应用程序共享首选项文件后,当我尝试创建/更新我的系统而不是编辑我的时候正在使用我之前读过的那个。如果恰恰相反,我开始更新我的并稍后阅读其他应用程序 - 而不是阅读另一个应用程序,正在访问的应用程序是我的。
有什么想法吗?
我用来阅读共享pref的代码是[其中packageName是另一个app pckg]:
Context con = context.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences pref = con.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_WORLD_READABLE);
pref.getBoolean(SHARED_PREF_PROP, false);
我在app app共享中使用的代码是:
SharedPreferences prefs= getSharedPreferences(SHARED_PREF_NAME, context.MODE_WORLD_READABLE);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(SHARED_PREF_PROP, value);
editor.commit();
提前致谢。
答案 0 :(得分:3)
SharedPreferences are stored local to the package name of your application.从听起来,你有两个完全独立的应用程序,包含不同的包名。这意味着您不是从一个读取,而是创建两个存储在不同文件夹中的同名文件。为了从不同的SharedPreferences
文件中读取不同的活动,您必须将它们放在AndroidManifest
文件定义的相同包名下。
另一个选项,因为您知道其他应用程序的包名称(我假设),就是选择将创建并处理它的主应用程序。然后使用直接URI直接从文件本身读取。由于您将权限设置为MODE_WORLD_READABLE
,系统应该允许您执行此操作。虽然,它可能会阻止您访问该文件夹本身。我个人从未尝试过。
答案 1 :(得分:0)
您可以使用此代码段阅读其他应用的偏好设置。
String PACKAGE_NAME = "com.gr.iasi";
String PREFERENCE_NAME = "GlobalPrefsJorge";
try {
myContext = createPackageContext(PACKAGE_NAME,Context.MODE_WORLD_WRITEABLE);
SharedPreferences testPrefs = myContext.getSharedPreferences(PREFERENCE_NAME, Context.MODE_WORLD_READABLE);
Map<String, ?> items = testPrefs .getAll();
for(String s : items.keySet()){
//Print keys and values;
Log.i("***" +s.toString(), items.get(s).toString());
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}