【问题标题】:Sharing progress data between Android apps在 Android 应用程序之间共享进度数据
【发布时间】: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 总体上运行良好。

标签: android sharedpreferences


【解决方案1】:

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

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

SharedPreferences settings = getSharedPreferences( PREFS_NAME, 0 );

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    相关资源
    最近更新 更多