由于我的游戏有 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/

10-09 03:39