getAPKExpansionZipFile() возвращает ноль

Поскольку моя игра весит 100 Мб, мне нужно использовать файл расширения. Я помещаю ниже код в MainActivity в функции onCreate()

    ZipResourceFile expansionFile = null;

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

Я не использую файл расширения патча, только основной, поэтому я думаю, что правильно поставить 0 в качестве версии. Когда я регистрируюсь, чтобы проверить, успешно ли загружен файл расширения, я получаю нулевое значение.

    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-архив». Но все же я не могу получить доступ к файлам из него, так как использую AssetManager из Libgdx.

Я нашел другой способ, который сейчас тестирую.


person draziw    schedule 28.04.2014    source источник
comment
Эй, братан, тебе удалось использовать файлы exp и libgdx? Как вы решили ассетменеджер??   -  person chelo_c    schedule 23.05.2014
comment
Привет, chelo_c. Да, мне удалось загрузить хотя бы изображения. Это не сработало для звуков. Итак, я получил два экземпляра AssetManager. Мне пришлось создать собственный FileHandleResolver, который использует собственный FileHandle. В моем FileHandle я переопределяю функцию read() для загрузки zip-файла. Затем, когда вы создаете экземпляр AssetManager, вы передаете свой FileHandleResolver конструктору. Я напишу полное решение в своем ответе.   -  person draziw    schedule 24.05.2014


Ответы (2)


Решение проблемы, когда 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 должен быть точно таким же, как указано в файле манифеста:

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

person draziw    schedule 30.04.2014

Для меня это был размер файла расширения в байтах. Я заархивировал и никогда не менял размер файла в коде. Следовательно, я получал нулевое значение. Я ошибся всего на несколько байтов, и это заняло весь мой рабочий день. Не знал, что это так важно :(

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
person Alex    schedule 27.04.2016