我一直在寻找解决这个问题的日子,但没有成功。
我想从旧应用中获取共享首选项设置并将其放到我的新应用中。 但我遇到了一些安全问题(嫌疑人)。
我的代码:
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,但它不会从我的旧应用程序中检索任何内容。
我试过谷歌搜索,似乎大多数人可以运行上面的代码没有错误。 有什么我错过了吗?
答案 0 :(得分:3)
我们已经针对Android手册Android in Practice完成了此操作。关键是为两个应用程序使用相同的进程和用户ID。示例代码和示例应用程序位于Google Code(SharedProcessApp1和SharedProcessApp2)。你可以从那里去。
答案 1 :(得分:1)
您确实可以跨应用程序共享首选项。这就是为什么它被称为SharedPreferences。
您需要做的是确保两个应用程序都使用相同的证书进行签名,并且它们在AndroidManifest.xml文件中共享相同的SharedUserId:read here。
这是因为您从
获得的SharedPreferencesPreferenceManager.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