【问题标题】:Android Shared Preferences across different applications跨不同应用程序的 Android 共享首选项
【发布时间】:2012-09-11 19:05: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();

提前致谢。

【问题讨论】:

    标签: android sharedpreferences


    【解决方案1】:

    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.

    【讨论】:

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

    您可以使用此 sn-p 从其他应用读取首选项。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多