【发布时间】:2013-04-23 16:27:44
【问题描述】:
我几乎完成了为 Android 市场编写的游戏。我有一个完整版和一个只有一半级别的免费版。我读过很多人遇到类似情况,遇到以下问题,但找不到满意的解决方案:
我的应用是独立的,但我希望它们共享数据。至少我希望完整版能够读取免费版的进度数据。如果用户完成免费版,然后安装完整版,则需要访问进度信息,因为游戏的第一阶段与免费版相同,并且应该共享/映射进度。
根据我的阅读,保存游戏进度的最佳方法是使用 SharedPreferences,这是我正在做的,而且效果很好。
在寻找共享数据的方法时,我读到最好的办法是在两个 AndroidManifest.xml 文件中定义相同的 android:sharedUserId 为相同的值,并确保两个应用程序使用相同的密钥进行签名:
What is sharedUserId in Android, and how is it used?
multiple apps, sharing same data directory
我已经这样做了,并通过使用 ApplicationInfo 查看两个应用程序的 uid 来检查它是否正常工作,它们是相同的。但是,我当时期望能够从两个应用程序(在不同时间运行)读取和写入 SharedPrefs 并读取/写入相同的数据。但可惜没有。如果这不会使应用共享相同的 SharedPreferences,那么它们通过指定相同的 sharedUserId 共享哪些数据?
经过更多挖掘,有些人似乎在说我需要先访问其他应用的上下文:
http://thedevelopersinfo.com/2009/11/25/getting-sharedpreferences-from-other-application-in-android/
Can't read SharedPreferences fron another application
所以如果我想让 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 的数据。
我只是不知道我是否以正确的方式做事但遗漏了一些东西,或者这根本不是正确的方法。我只想以这样一种方式链接我的 2 个应用程序,以便一个可以读取另一个的 SharedPrefs。大多数完整版应用程序如何链接到免费用户的数据?
任何帮助将不胜感激!
【问题讨论】:
-
您不将进度数据存储在外部存储介质上吗?
-
也许这是一种常见的方法,但实际上没有太多可保存的,而且 SharedPrefs 总体上运行良好。