getAPKExpansionZipFile() returns null



由于我的游戏有100Mb,我需要使用扩展文件。我在函数onCreate()的MainActivity中放入了以下代码

    ZipResourceFile expansionFile = null;
    try {
        expansionFile = APKExpansionSupport.getAPKExpansionZipFile(getApplicationContext(),2,0);
    } catch (IOException e) {
        e.printStackTrace();
    }

我不使用补丁扩展文件,只使用main,所以我认为将0作为版本是正确的。当我登录以检查expansionFile是否成功加载时,我得到null值。

    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 storageAndroidobbcom.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类中使用它来从中获取图像。如果你找到不同的方法,那就由你自己决定了。我就是这么做的。

公共静态ZipResourceFile扩展文件;

然后在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工具将文件打包到OBB文件中的问题。它使getAPKExpansionZipFile()返回null。所以我只是压缩了所有的文件。查看此处以获得更详细的解释:https://developer.android.com/google/play/expansion-files.html

对我来说,它是以字节为单位的扩展文件大小。我在代码中重新压缩并从未更改文件大小。因此,我得到了空值。我只休息了几个字节,这就花了我在工作场所的一整天时间。没有意识到它有那么重要:(

private static final XAPKFile[] xAPKS = {
        new XAPKFile(true, Constants.MAIN_OBB_VERSION, Constants.EXPANSION_FILE_SIZE) // right here expansion file size must match exactly.
};
//in Constants class
public static final int EXPANSION_FILE_SIZE = 285516838; //expansion file size in bytes

相关内容

  • 没有找到相关文章

最新更新