由于我的游戏有 100Mb,我需要使用扩展文件。我将以下代码放在函数 onCreate() 的 MainActivity 中
ZipResourceFile expansionFile = null;
try {
expansionFile = APKExpansionSupport.getAPKExpansionZipFile(getApplicationContext(),2,0);
} catch (IOException e) {
e.printStackTrace();
}
我不使用补丁扩展文件,只使用主文件,所以我想把 0 作为版本是正确的。当我登录以检查 expandFile 是否已成功加载时,我得到空值。
if(expansionFile == null)
Gdx.app.log("EXPANSION_FILE", "NULL");
else
Gdx.app.log("EXPANSION_FILE", "NOT NULL");
我按照 https://developer.android.com/google/play/expansion-files.html 上的说明进行操作
我手动将 main.2.com.my.game.obb 文件放在我的 Nexus 设备上的文件夹中:
Internal storage\Android\obb\com.my.game\
Android\obb 文件夹中还有来自其他游戏的其他 obb 文件,因此这必须是正确的位置。为什么不挂载 obb 扩展文件的任何线索?
更新
我实现了
DownloaderActivity
并且它下载扩展文件没有任何问题。它给了我“不是 zip 存档”日志消息。我找到了避免它的方法。我压缩了 OBB 文件并将其上传到开发人员控制台。无论如何,它会自动转换为 OBB,但是这次当我在 Nexus 上下载它时,它不再为我提供 ZipResourceFile
的空值,并且不再给我“不是 zip 存档”消息。但是我仍然无法从中访问文件,因为我使用的是 Libgdx 的 AssetManager。我找到了另一种方法,我现在正在测试。
最佳答案
getAPKExpansionZipFile()返回null的解决方法是不使用JOBB工具,而是将所有内容压缩后上传。 Google Play 会自动将其转换为 OBB。
从扩展文件加载图像的完整解决方案:
我在自己的 Game 类中创建了一个静态变量,它是 ZipResourceFile
的一个实例。我将其设为静态,因为我想在 MainActivity
类中加载扩展文件并在我的 FileHandle
类中使用它来从中获取图像。如果您找到不同的方式,则取决于您。我就是这样做的。
然后在您的 MainActivity
类中加载扩展文件。我在 OnCreate() 函数中做到了。
try {
GameInfo.expansionFile = APKExpansionSupport.getAPKExpansionZipFile(getBaseContext(),22,0);
} catch (IOException e) {
e.printStackTrace();
}
传递给函数的值如下:
getAPKExpansionZipFile(Context ctx, int mainVersion, int patchVersion)
mainVersion 需要与 Manifest 文件中声明的完全相同:
android:versionCode="22"
此外,您的扩展文件的名称中需要具有相同的数字:
main.mainVersion.com.name.title
创建您自己的 FileHandle 类。这是它在扩展文件中查找特定文件的地方,例如“image.png”。
public class CustomFileHandle extends FileHandle
{
public CustomFileHandle (String fileName) {
super(fileName);
}
@Override
public InputStream read()
{
InputStream input = null;
try {
input = GameInfo.expansionFile.getInputStream(file.getPath().replace('\\', '/'));
} catch (IOException e) {
e.printStackTrace();
}
return input;
}
}
创建您自己的 FileHandleResolver 类。这是您使用自定义 FileHandle 的地方。
public class CustomFileHandleResolver implements FileHandleResolver
{
@Override
public FileHandle resolve(String fileName) {
return new CustomFileHandle(fileName);
}
}
创建 AssetManager 的实例并将 FileHandleResolver 传递给构造函数。
assetManager = new AssetManager(new CustomFileHandleResolver());
如果我没有省略任何步骤,那么这就是从扩展文件加载文件所需要做的。正如我在开头提到的,我发现使用 JOBB Tool 将文件打包成 OBB 文件的问题。它使 getAPKExpansionZipFile() 返回 null。所以我只是压缩了所有文件。在这里查看更详细的解释:https://developer.android.com/google/play/expansion-files.html
关于android - getAPKExpansionZipFile() 返回 null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23342450/