我几乎完成了为 Android 市场编写的游戏。我有一个完整版和一个只有一半级别的免费版。我读过很多人在类似情况下遇到以下问题,但找不到令人满意的解决方案:
我的应用程序是独立的,但我希望它们共享数据。至少我希望完整版能够读取免费版的进度数据。如果用户完成免费版,然后安装完整版,则需要访问进度信息,因为游戏的第一阶段与免费版相同,并且应该共享/映射进度。
根据我的阅读,保存游戏进度的最佳方法是使用 SharedPreferences,这就是我正在做的事情,而且效果很好。
在寻找共享数据的方法时,我读到最好的办法是在两个 AndroidManifest.xml 文件中定义相同的 android:sharedUserId 为相同的值,并确保两个应用程序都使用相同的密钥进行签名:
Android 中的 sharedUserId 是什么,它是如何使用的?
我已经完成了这项工作,并通过使用 ApplicationInfo 查看两个应用程序的 uid 来检查它是否正常工作,它们是相同的。但是,我当时期望能够从两个应用程序(在不同时间运行)读取和写入 SharedPrefs 并读取/写入相同的数据。但可惜没有。如果这不会使应用程序共享相同的 SharedPreferences,那么它们通过指定相同的 sharedUserId 共享什么数据?
在进行了更多挖掘之后,有些人似乎在说我需要先访问另一个应用程序的上下文:
http://thedevelopersinfo.com/2009/11/25/getting-sharedpreferences-from-other-application-in-android/
无法从另一个应用程序读取 SharedPreferences
因此,如果我希望 App2 访问 App1 的数据,这会在 App2 的 Activity 中为我提供以下代码:
Context otherAppsContext = null;
try {
otherAppsContext = createPackageContext("com.example.app1package",0);
} catch (NameNotFoundException e) {
}
SharedPreferences sharedPrefs = otherAppsContext.getSharedPreferences("TestShareData",Context.MODE_PRIVATE);
但是当我向 sharedPrefs 询问数据时,它仍然只给我来自当前应用程序(App2 而不是 App1)的数据。
检查 otherAppsContext 变量我不确定它给了我什么。它有一个 mBasePackageName 属性,它是 App2 的包名称(错误)。但它也有一个 mPackageInfo 属性,它似乎包含有关 App1 的数据。
我只是不知道我是否以正确的方式做事但遗漏了一些东西,或者这根本不是正确的方法。我只想以一种可以读取另一个的 SharedPrefs 的方式链接我的 2 个应用程序。大多数完整版本的应用程序如何链接到免费数据?
任何帮助将不胜感激!