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