6

在我的 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

4 回答 4

4

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

为此,您只需在两个应用程序的文件中添加一个标签,例如android:sharedUserId="com.example.you"您的<manifest>标签(当然,两个应用程序中的标签必须相同)。AndroidManifest.xmlcom.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" >
...

有关如何使这项工作的深入描述,请参阅我关于如何在两个不同的 android 应用程序之间共享 SharedPreferences 文件的答案?

于 2012-06-13T18:19:55.900 回答
1

过去三天我一直在为 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. Context.CONTEXT_IGNORE_SECURITY打电话的时候用过createPackageContext()
于 2012-06-13T19:28:02.740 回答
1

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

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

这是另一个曾经分享偏好的开发人员的博客文章的链接。MatrixCursor

高温高压

于 2012-06-13T19:08:00.170 回答
1

您需要使用MODE_WORLD_READABLE而不是MODE_PRIVATE. 阅读文档以获取更多信息。

这是一个教程,可以进一步检查您是否还有更多错误。

于 2012-06-13T18:14:30.107 回答