10

我一直在开发一个 Android 应用程序,它通过 sharedpreference 文件与设备上安装的其他应用程序进行交互。

该文件被创建为 MODE.WORLD_READABLE 并且每个已安装的应用程序都有自己的文件,该文件具有共同定义的名称和属性(更改的是该特定属性的值)。

例如,AppA 和 AppB 应该各有一个名为“app_shared_file.xml”的共享文件,其属性为“property_shared_file”。

从我的应用程序中,我想首先访问该文件并读取该属性值,并根据该结果创建/更新我的。

尽管如此,我在实现这一目标时遇到了一些问题。在 Android 文档中,我看到:

检索并保存首选项文件“名称”的内容,返回一个 SharedPreferences,您可以通过它检索和修改其值。仅将 SharedPreferences 对象的一个​​实例返回给具有相同名称的任何调用者,这意味着他们将在进行编辑后立即看到彼此的编辑。

在阅读了其他应用程序共享首选项文件后,当我尝试创建/更新我的系统而不是编辑我的系统时,我正在使用我之前阅读过的系统。如果相反,我首先更新我的应用程序并稍后阅读另一个应用程序 - 而不是阅读另一个应用程序,正在访问的是我的应用程序。

有什么想法吗?

我用于读取共享首选项的代码是 [其中 packageName 是另一个应用程序 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);

我用于在应用程序共享首选项中编写的代码是:

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

提前致谢。

4

2 回答 2

3

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

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

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

于 2012-09-19T13:15:06.893 回答
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();
        }
于 2013-05-23T22:49:31.737 回答