在我的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();
}
我该怎么做?有什么可以添加清单文件吗?
谢谢!
答案 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)
答案 2 :(得分:1)
虽然此处的其他解决方案在技术上可以在大多数情况下使用,但Android为您提供的用于在流程/应用程序之间共享数据的框架是ContentProvider
。它可能看起来像是一个额外的抽象,但它是保证工作的那个。
虽然此组件的接口将调用镜像到数据库中,但基础数据结构可以是您喜欢的任何内容。具体而言,您可以返回MatrixCursor
以响应提供SharedPreferences
对象内容的查询,并且可以实现删除/更新调用的URI方案,该方案可用于修改首选项其他应用程序。
以下是使用MatrixCursor
分享偏好设置的其他开发者的link to a blog post。
HTH
答案 3 :(得分:1)
过去三天我一直在努力使用SharedPreferences,但我想我终于为自己解决了这个问题。以下是您应该尝试的一些技巧和难题,可能对您有所帮助(以及其他堆栈溢出用户的负载)。
请注意,我的所有观察都是针对 ICS (4.0.2和4.0.4)。
android:sharedUserId
,删除应用,则文件/文件夹权限将不正确。因此,如果您已经重新启动应用程序,则不应更改该值。Context.MODE_*
值,删除应用的数据(或整个应用),以确保文件权限不正确。android:sharedUserId
,请务必使用相同证书对应用进行签名。createPackageContex()
,我也只是在阅读本地共享首选项时遇到了应用程序的问题。这最终对我有用:
android:sharedUserId
。 (不一样android:process
。)Context.MODE_WORLD_READABLE
来读取和编写本地首选项,以及阅读其他应用程序的首选项。Context.CONTEXT_IGNORE_SECURITY
时使用createPackageContext()
。