不同应用间的Android共享偏好设置

10
我一直在开发一个Android应用程序,通过共享首选项文件与设备上安装的其他应用程序进行交互。
此文件是以MODE.WORLD_READABLE创建的,每个已安装的应用程序都有自己的文件,具有共同定义的名称和属性(更改的是该特定属性的值)。
例如,AppA和AppB应该分别拥有名为“app_shared_file.xml”的共享文件,并具有属性“property_shared_file”。
从我的应用程序中,我想首先访问此文件并读取该属性值,根据该结果,我想创建/更新我的文件。
然而,我在实现这一点方面遇到了一些问题。在Android文档中,我看到:
“检索并保留首选项文件'name'的内容,返回SharedPreferences,通过它可以检索和修改其值。对于相同名称的任何调用者,只返回一个SharedPreferences对象,这意味着他们将看到彼此的编辑结果。”
在读取其他应用程序的共享首选项文件后,当我尝试创建/更新我的文件时,系统不是编辑我的文件,而是使用我之前读取的那个。相反,如果我首先更新我的文件,然后再读取另一个应用程序 - 而不是读取其他文件,正在访问的是我的文件。
你有什么想法吗?
我用来读取共享首选项的代码是[其中packageName是其他应用程序包]:
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);

我在应用程序共享偏好中进行写入的代码如下:

SharedPreferences prefs= getSharedPreferences(SHARED_PREF_NAME, context.MODE_WORLD_READABLE);
SharedPreferences.Editor editor = prefs.edit();
editor.putBoolean(SHARED_PREF_PROP, value); 
editor.commit();

提前致谢。

2个回答

3

SharedPreferences被存储在应用程序的包名本地。从听起来的样子,您有两个完全独立的具有不同包名的应用程序。这意味着您不是从一个读取,而是创建了两个相同名称的文件,这些文件存储在不同的文件夹中。为了使不同的活动从相同的SharedPreferences文件中读取,您必须将它们放在由AndroidManifest文件定义的相同包名下。

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

我相信我已经找到了您要寻找的答案。


是的,有两个不同的应用程序,每个应用程序都有自己存储在其自己的shared_prefs文件夹中的共享首选项文件。是的,我通过PackageManager知道了另一个应用程序的包名,但我无法知道哪个活动/类将处理它。我已经看过那个链接了,在这里的问题是访问具有相同名称的两个不同共享首选项 - 我自己的和另一个应用程序的。打开一个后,当我尝试打开另一个时,引用指向最初打开的那个,而不是作为上下文发送的那个。 - user1683087

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接