Android:如何删除另一个包中的共享首选项

时间:2012-06-13 18:11:49

标签: android android-intent android-emulator

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

我该怎么做?有什么可以添加清单文件吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

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

要执行此操作,您只需将android:sharedUserId="com.example.you"标记添加到<manifest>文件的AndroidManifest.xml标记中,以用于您的两个应用(以及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?

上的答案

答案 1 :(得分:1)

您需要使用MODE_WORLD_READABLE代替MODE_PRIVATE。请阅读docs以获取更多信息。

如果您有任何更多错误,请tutorial进一步检查。

答案 2 :(得分:1)

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

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

以下是使用MatrixCursor分享偏好设置的其他开发者的link to a blog post

HTH

答案 3 :(得分:1)

过去三天我一直在努力使用SharedPreferences,但我想我终于为自己解决了这个问题。以下是您应该尝试的一些技巧和难题,可能对您有所帮助(以及其他堆栈溢出用户的负载)。

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

  1. 如果您更改android:sharedUserId删除应用,则文件/文件夹权限将不正确。因此,如果您已经重新启动应用程序,则不应更改该值。
  2. 如果您更改Context.MODE_*值,删除应用的数据(或整个应用),以确保文件权限不正确。
  3. 如果您使用android:sharedUserId,请务必使用相同证书对应用进行签名
  4. 在两个应用中使用不同的文件名作为首选项。即使我使用了createPackageContex(),我也只是在阅读本地共享首选项时遇到了应用程序的问题。
  5. 这最终对我有用:

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