不同应用程序的Android共享首选项

时间:2012-09-19 13:01:52

标签: android sharedpreferences

我一直在开发一个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();

提前致谢。

2 个答案:

答案 0 :(得分:3)

SharedPreferences are stored local to the package name of your application.从听起来,你有两个完全独立的应用程序,包含不同的包名。这意味着您不是从一个读取,而是创建两个存储在不同文件夹中的同名文件。为了从不同的SharedPreferences文件中读取不同的活动,您必须将它们放在AndroidManifest文件定义的相同包名下。

另一个选项,因为您知道其他应用程序的包名称(我假设),就是选择将创建并处理它的主应用程序。然后使用直接URI直接从文件本身读取。由于您将权限设置为MODE_WORLD_READABLE,系统应该允许您执行此操作。虽然,它可能会阻止您访问该文件夹本身。我个人从未尝试过。

I believe I have found the answer you are looking for.

答案 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();
        }