0

我目前正在开发一款 Android 游戏,我的目标是创建游戏的免费/演示版,以便用户试用。但我也希望演示中的存档游戏在完整版中自动导入

我存储在应用程序私有存储中的存档游戏基本上是映射多个 Java 对象的JSON字符串。用户可以根据需要创建任意数量的“新游戏”,并且他开始的每个游戏都有一个“自动保存”和一个“手动保存”文件。为了跟踪所有文件,我有一个包含文件名和一些附加信息(如玩家姓名等)的列表。

所以基本上有很多小文件处理保存游戏。这可能不是最优雅的方法,但效果很好。

所以这是我的问题:假设用户已经在演示版中启动了一个游戏(因此将有 3 个文件保存在演示版的私人存储中)。我现在如何从完整版中访问这些文件?

这两个版本不会有太大的不同。它们实际上是相同的,尽管有演示版本的限制。但我会使用相同的代码库。

我知道在这个论坛和其他地方有很多关于这个问题的问题,但我找不到合适的解决方案。我能找到的所有内容都涉及:

  • 将文件存储在世界可读的存储设备中(如 SD 卡)或
  • 使用SharedPreferences

但我不希望用户能够阅读存档游戏(甚至更改它——因为这可能会搞砸游戏)——所以没有 sd 卡,我也不能使用 SharedPreferences,因为每个单独的存档游戏都有大约。200 行代码(许多 Java 对象被翻译成 JSON)并将所有这些值和对象映射到某种用于 SharedPreferences 的键值结构对我来说似乎是不可能的。

这一切都搞砸了,还是有人有想法?

感谢您抽出宝贵时间,期待听到您的想法!

  • 克里斯托夫
4

3 回答 3

2

所以我只看到 2 个解决方案:

第一个是 WorldReadable SharedPreferences。你说,你存储 JsonStrings,所以没有必要再向下映射它们,如果你可以用你的 json-strings 制作对象(我喜欢使用Gson来做这种工作),你可以简单地存储这些字符串在 SharedPreferences 中。

第二种方式是打扰ContentProviders并实现一个 ContentResolver 接口。对于您的用例,这是我可以想象的最安全的方式,但是您必须为此做很多事情

于 2012-12-07T15:07:04.390 回答
1

你无法避免的

有两件事是你无法避免的:

  • 如果用户决定root手机,你不能阻止用户访问它,不管你做了什么让它变得更难。
  • 如果您希望第二个应用程序在非 root 设备中访问相同的数据(保存的游戏),那么用户总是可以从您的应用程序外部访问它。

你能做些什么来让它变得更难

  • 您可以在将数据存储到文件或共享首选项之前加密(即使用设备 IMEI)数据(与哈希一起防止更改)
  • 您可以将数据存储在 SQLite 数据库中(需要更多知识来更改它),并在存储之前加密(更难)。
  • 您可以使用SQLCipher将其存储在加密数据库中(加密将是透明的)。

问候。

于 2012-12-07T15:24:47.823 回答
0

您可以使用共享的内容提供者(这里是关于 ContentProviders 的一般文档http://developer.android.com/guide/topics/providers/content-providers.html

然后,您必须在清单中使用以下标志将其声明为可导出: android:exported="true"

例子:

<provider android:name="[yourpackage_here].SavegameProvider"
 android:authorities="[yourpackage_here].SavegameProvider"
 android:exported="true" />

您将能够在您的新应用程序中打开它。

于 2012-12-07T15:23:03.767 回答