android - 在 Android 应用之间共享进度数据

标签 android sharedpreferences

我即将完成为 Android 市场编写的游戏。我有一个完整版和一个只有一半关卡的免费版。我读过很多人遇到类似情况,遇到以下问题,但找不到满意的解决方案:

我的应用程序是独立的,但我希望它们共享数据。至少我希望完整版能够读取免费版的进度数据。如果用户完成免费版,然后安装完整版,则需要访问进度信息,因为游戏的第一阶段与免费版相同,应该共享/映射进度。

据我所知,保存游戏进度的最佳方法是使用 SharedPreferences,这正是我正在做的,而且效果很好。

在寻找共享数据的方法时,我读到最好的办法是在两个 AndroidManifest.xml 文件中将相同的 android:sharedUserId 定义为相同的值,并确保两个应用程序使用相同的 key 签名:

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 的数据。

我只是不知道我做事的方式是否正确,但是否遗漏了一些东西,或者这根本不是正确的方法。我只想以一种可以读取另一个应用程序的 SharedPrefs 的方式链接我的 2 个应用程序。大多数完整版应用程序如何链接到免费数据?

如有任何帮助,我们将不胜感激!

最佳答案

当然这种情况经常发生,但我想我可能已经解决了我自己的问题。

我的两个应用程序(完整版和免费版)都以相同的名称写入 sharedPrefs:

SharedPreferences settings = getSharedPreferences( PREFS_NAME, 0 );

两个应用的 PREFS_NAME 相同。当我从 App2 请求 App1 的上下文时,它给了我一个上下文,但它似乎是一个可以访问两个应用程序数据的上下文?

为了解释当我从 App2 获取 App1 的上下文并请求提供名称 PREFS_NAME 的 SharedPreferences 时,我从 App2 获取了 SharedPrefs。但我尝试更改 App1 的 SharedPrefs 名称,然后从 App2 的上下文中访问它,突然它获取了 App1 的数据。

我真的不知道我从 createPackageContext 调用中得到了什么,它似乎是两组数据的句柄。但我认为我可以让我的应用程序使用不同的 SharedPrefs 名称,并让完整的应用程序在需要时只搜索免费应用程序的数据。

关于android - 在 Android 应用之间共享进度数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16174532/

相关文章:

java - 如何在 Java 中从城市名称中查找国家/地区名称?

java - 膨胀类 com.android.internal.widget.ActionBarContainer 时出错

android - 针对 GLIBC 构建 NDK 库

java - 使用 SharedPreferences 在 Android 中实现 Collection 夹列表

java - 访问另一个类的微调器时出现 NullPointerException

android - 如何知道一个 Action 是全局完成的

java - 在 Android 中获取应用程序的 SharedPreferences?

android - 如何在 Android 中获取对象类型的偏好?

java - 如何获得 PreferenceFragment 的值(value)

Android 录制音频时出现 SIGSEGV 错误