4

我几乎完成了为 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 个应用程序。大多数完整版本的应用程序如何链接到免费数据?

任何帮助将不胜感激!

4

1 回答 1

0

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

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

SharedPreferences settings = getSharedPreferences( PREFS_NAME, 0 );

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

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

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

于 2013-04-23T18:02:20.020 回答