Android:无法访问其他应用的SharedPreference

时间:2012-03-22 09:02:22

标签: android sharedpreferences

我一直在寻找解决这个问题的日子,但没有成功。

我想从旧应用中获取共享首选项设置并将其放到我的新应用中。 但我遇到了一些安全问题(嫌疑人)。

我的代码:

Context c = createPackageContext("my.app.pkg", Context.CONTEXT_IGNORE_SECURITY);            
SharedPreferences sp = c.getSharedPreferences("my.app.pkg", Context.CONTEXT_IGNORE_SECURITY);

运行上面的代码给我这个:

  

未经许可尝试读取首选项文件/data/data/my.app.pkg/shared_prefs/my.app.pkg_preferences.xml

甚至认为对象sp不为null,但它不会从我的旧应用程序中检索任何内容。

我试过谷歌搜索,似乎大多数人可以运行上面的代码没有错误。 有什么我错过了吗?

3 个答案:

答案 0 :(得分:3)

我们已经针对Android手册Android in Practice完成了此操作。关键是为两个应用程序使用相同的进程和用户ID。示例代码和示例应用程序位于Google Code(SharedProcessApp1和SharedProcessApp2)。你可以从那里去。

答案 1 :(得分:1)

您确实可以跨应用程序共享首选项。这就是为什么它被称为SharedPreferences。

您需要做的是确保两个应用程序都使用相同的证书进行签名,并且它们在AndroidManifest.xml文件中共享相同的SharedUserId:read here

这是因为您从

获得的SharedPreferences
PreferenceManager.getDefaultSharedPreferences(context)

总是MODE_PRIVATE。

但是在应用程序中,您还可以使用以下内容获取Context中的SharedPreferences对象:

SharedPreferences prefs = getSharedPreferences("my_public_shared_prefs", MODE_WORLD_READABLE);

您可以使用以下内容从其他应用中自由搜索:

Context context = createPackageContext("my_target_app_package", Context.CONTEXT_IGNORE_SECURITY);            
SharedPreferences prefs = context.getSharedPreferences("my_public_shared_prefs", MODE_WORLD_READABLE);

请确保您不存储任何私人信息,因为它具有全球可读性,这意味着您和其他任何人都可以读取该数据。

要完成,如果要检索旧应用程序的SharedPreferences,则需要使用Manifest文件中的SharedUserId更新旧应用程序。

答案 2 :(得分:-1)

Android APplications在自己的沙箱中运行,因此一个应用程序无法访问其他活动的数据。 BUt如果应用程序想要共享其部分数据,可以通过ContentProvider实现。

请参阅内容提供商:http://developer.android.com/guide/topics/providers/content-providers.html