【问题标题】:Android : How to remove shared preferences in another packageAndroid:如何删除另一个包中的共享首选项
【发布时间】:2012-06-16 18:19:18
【问题描述】:

在我的 android 应用程序中,我编写了代码以读取另一个 Android 应用程序的共享数据,然后从共享首选项中删除该数据。 我的代码如下:

try {

     con = createPackageContext("com.testapp.ws", 0);
     SharedPreferences pref = con.getSharedPreferences("demopref", Context.MODE_PRIVATE);
     ipAdr = pref.getString("demostring", "No Value");
     pref.edit().remove("demopref").commit();
   }

这显示以下错误:

06-12 11:52:07.400: E/ApplicationContext(3587): Couldn't rename file /data/data/com.testapp.ws/shared_prefs/demopref.xml to backup file /data/data/com.testapp.ws/shared_prefs/demopref.xml.bak

我在我的其他应用程序中使用此方法来制作共享数据

 public void shareData(){
    String strShareValue = ip;
    SharedPreferences prefs = getSharedPreferences("demopref",Context.MODE_WORLD_READABLE);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString("demostring", strShareValue);
    editor.commit();
}

我该怎么做?有什么要添加Manifest文件的吗?

谢谢!

【问题讨论】:

    标签: android android-intent android-emulator


    【解决方案1】:

    如果您在清单文件中使用android:sharedUserId,它应该可以工作。这是我自己遇到的权限问题。

    为此,您只需在您的两个应用程序的AndroidManifest.xml 文件中的<manifest> 标记中添加一个标记,例如android:sharedUserId="com.example.you"(并且两个应用程序中的com.example.you 必须相同) , 当然)。

    清单文件的示例开始:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="package.name"
        android:versionCode="1"
        android:versionName="1.0"
        android:sharedUserId="com.example.you" >
    ...
    

    如需深入了解如何实现此功能,请参阅我在 How can I share a SharedPreferences file across two different android apps? 上的回答

    【讨论】:

    • 你能解释一下我如何在这里使用它。我不知道。我只是一个学习者:)
    • 编辑了上述内容 :) 还要检查原始段落中的链接以查看文档。
    • 感谢您的解释。我测试了它,但仍然有同样的问题。同样的错误“无法重命名文件”...为什么会这样?你有什么想法吗?
    • 我自己也遇到了麻烦。我相信正确检索共享首选项文件并将权限授予第二个应用程序使用它并且该文件的所有内容都可以正常工作是一个问题 - 但是,当您尝试执行SharedPreferences.Editor.commit() 时,它会自动尝试保存备份文件,而您的第二个应用程序永远不会被授予写入权限。因此提交失败。但是我并不肯定这是问题所在,这只是一种可能的解释。
    • 有什么方法可以删除那个 XML 吗?
    【解决方案2】:

    过去三天我一直在为 SharedPreferences 苦苦挣扎,但我想我终于自己解决了。以下是您应该尝试的一些技巧和陷阱,它们可能会对您(以及大量其他 stackoverflow 用户)有所帮助。

    请注意,我所有的观察都是针对 ICS(4.0.2 和 4.0.4)。

    1. 如果您更改android:sharedUserId删除应用程序因为文件/文件夹权限不正确。因此,如果您已发布应用,则不应更改该值。
    2. 如果您更改 Context.MODE_* 值,请删除应用的数据(或整个应用)以确保文件权限没有错误。
    3. 如果您使用android:sharedUserId,请务必使用相同的证书为应用签名
    4. 为两个应用程序中的首选项使用不同的文件名。尽管我使用了createPackageContex(),但我在读取本地共享首选项时遇到了问题。

    这最终对我有用:

    1. 我为这两个应用程序使用了相同的android:sharedUserId。 (不一样的android:process。)
    2. 我使用Context.MODE_WORLD_READABLE 来读取和写入本地首选项,以及读取其他应用的首选项。
    3. 我在调用createPackageContext()时使用了Context.CONTEXT_IGNORE_SECURITY

    【讨论】:

    • 感谢您分享您的知识!但对于 Android 2.2 没办法 :(
    【解决方案3】:

    虽然此处的其他解决方案在技术上适用于大多数情况,但 Android 为您提供的用于在进程/应用程序之间共享数据的框架是 ContentProvider。它可能看起来像很多额外的抽象,但它是保证工作的。

    虽然此组件的接口将调用镜像到数据库中,但底层数据结构可以是您喜欢的任何内容。具体来说,您可以返回一个MatrixCursor 来响应提供SharedPreferences 对象内容的查询,并且您可以为删除/更新调用实现一个URI 方案,该方案可用于修改其他应用程序的首选项。

    这是来自另一位开发人员的link to a blog post,他使用MatrixCursor 分享偏好。

    HTH

    【讨论】:

      【解决方案4】:

      您需要使用MODE_WORLD_READABLE 而不是MODE_PRIVATE。阅读docs了解更多信息。

      这里是tutorial,如果您还有其他错误,请进一步检查。

      【讨论】:

      • 即使使用Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE 也可能无法正常工作。我自己也有这个问题。此外,创建共享首选项时的上下文很重要,而不是用于从外部应用程序检索它们的包的上下文。
      • 此外,该教程将为您提供相同的结果 - 我自己尝试过。它只适用于阅读偏好,他已经可以做到。
      • 好吧,伙计,你似乎有更好的体验。 :-) 我的知识是基于我读过的,还没有机会实现它。
      • 是的 matt5784 是正确的。我也试过 Context.MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE...但同样的错误发生了!
      • android 团队中的某个人在 google 群组线程上发表了评论,大意是“您不应该尝试在应用程序之间实现 sharedprefs,该功能不适合工作 - 请改用 contentprovider 。”所以它没有得到官方支持,即使你可以让它工作也可能有问题。但是,请参阅我上面的答案以了解应该工作的方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 2011-09-05
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 2012-09-20
      相关资源
      最近更新 更多