Файл расширения Android

Я пытаюсь сделать приложение, которое содержит ~ 80 мес PNG (это автономное приложение, поэтому мне нужно хранить их на телефоне).

Приложение отлично работает локально, но я не могу загрузить apk > 50mo. Итак, я пытаюсь реализовать файл расширения, который будет содержать все мои PNG. Поэтому я использую эту простую команду в Linux: _zip_ -0 _main.1.com.ctai.irisst.zip_ *_.png_ на моем /res/drawable-mdpi, чтобы создать файл расширения, а затем вручную поместить его в /Android/data/com.ctai.irisst/
Затем я использую этот код, чтобы разархивировать все мои данные в хранилище телефона, но когда я запускаю приложение, Я получаю пустой экран только около 10 секунд, а затем Android сообщает мне, что приложение не отвечает. Я вижу в проводнике файлов, что ~ 10 изображений PNG распаковываются, а в Logcat извлекается 1 файл каждую секунду. (и если я использую буфер, для загрузки моего приложения все равно требуется> 20 секунд)

Я реализовал следующую библиотеку:

"downloader_library","licencing_library","Sample_downloader" and "zip_file"  

но я действительно не использовал его на данный момент. (Должен ли я? Как?)

Мой вопрос прост, как я могу просто создать файл расширения и использовать свои изображения, не мешая работе пользователя? Я не нашел столько туториалов по Expansion Files и примеров проектов, так что я немного растерялся.


person k0mfushee    schedule 03.01.2013    source источник
comment
Вы можете добавить файлы расширения в магазин Google Play (если по этой причине у вас нет apk › 50m), также вы можете добавить экран загрузки, который будет запускаться при первом открытии приложения, и там вы можете распаковать/загрузить/изменить /get или что хотите, ваши изображения.   -  person Rotary Heart    schedule 03.01.2013


Ответы (3)


Вам не нужно распаковывать пакет. Вы можете прочитать все свои PNG в ZIP-файле расширения с помощью этого:

// Get a ZipResourceFile representing a merger of both the main and patch files
ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(appContext,
        mainVersion, patchVersion);

// Get an input stream for a known file inside the expansion file ZIPs
InputStream fileStream = expansionFile.getInputStream(pathToFileInsideZip);

**ИЗМЕНИТЬ**

Обратите внимание, что в приведенном выше коде InputStream будет указывать на файл внутри вашего ZIP-архива, а не на сам ZIP-файл. Например, если вы поместили файл flower.png в каталог с именем background внутри вашего ZIP-архива, вы можете использовать InputStream для этого файла следующим образом:

InputStream fileStream = expansionFile.getInputStream("background/flower.png");

**ИЗМЕНИТЬ**

Я думаю, что место, в которое вы поместили свой ZIP-файл, неверно. Согласно Руководству разработчика:

Если имя вашего пакета com.example.android, вам необходимо создать каталог Android/obb/com.example.android/ в общем хранилище.

После успешного тестирования вы можете загрузить ZIP-файл расширения вместе с APK через консоль разработчика.

Вы ознакомились с файлами расширения APK? Это довольно просто.

person Sam R.    schedule 03.01.2013
comment
Да, я пытался читать Руководство разработчика, но как новичок я довольно быстро потерялся... Если я использую функцию для чтения Zip-файла, как вы мне говорите, будут ли они храниться в памяти? Было бы полезно использовать их в файле макета, иначе мне пришлось бы объявить его в действии. - person k0mfushee; 03.01.2013
comment
Собираетесь ли вы использовать их для пользовательского интерфейса или, например, заполнить их в сетке, такой как миниатюра? - person Sam R.; 03.01.2013
comment
Если вы собираетесь использовать их в качестве пользовательского интерфейса (скажем, фон кнопки), вы должны сделать это программно. Просто прочитайте конкретный файл и создайте из него рисунок и установите его в свой вид на onCreate(). - person Sam R.; 03.01.2013
comment
Так, например, если у меня есть список изображений, которые я хочу отобразить, я использую: int[] a = {R.drawable.xxx, R.drawable.xxy); если я хочу использовать файл zip-ресурса для их замены, я должен использовать fileStream.read() ? - person k0mfushee; 04.01.2013
comment
да. Но вы должны создать Drawable из этого файла. Взгляните на это. Существует функция createFromStream(), которую можно использовать для создания рисунков из InputStream. - person Sam R.; 04.01.2013
comment
Кроме того, вы можете хранить свои drwabales в массиве, векторе или любом другом контейнере, а затем использовать их для своей логики. Drawable[] drawableArray = новый Drawable[sizeOfArrayInt]; - person Sam R.; 04.01.2013
comment
Честно говоря, я не очень понимаю, как это использовать. Я использую: ZipResourceFile extensionFile = new ZipResourceFile (mypath); InputStream fileStream = ExpansionFile.getInputStream(/myexpansionfile.zip); Drawer.createFromStream(fileStream,src); но я не мог использовать его для замены R.dawable.xxx (извините за мой абсолютный уровень новичка ... это позор) - person k0mfushee; 05.01.2013
comment
Я тоже младший нуб. Так что не беспокойтесь об этом. Что касается вашего вопроса, я обновлю свой ответ. Обратите внимание на отредактированную часть. - person Sam R.; 05.01.2013
comment
Вы также можете протестировать файлы расширения в магазине воспроизведения, используя параметры альфа- и бета-версий. См. мой пост для получения некоторой полезной информации о расширениях apk и чтении носителей непосредственно из почтового индекса. - person Jordy; 24.09.2014

Некоторая полезная информация для людей, которые попадают сюда, в этот пост, поскольку есть некоторые вещи, которые изменились в том, как работают расширения apk, а также если вы используете Android Studio для работы библиотек.

ПРИМЕЧАНИЕ 1

Вы больше не можете использовать черновик, так как ссылка для получения файла расширения еще не будет активной. Вы должны сначала загрузить версию в Alpha или Beta с файлом расширения. (добавление файла расширения возможно только из второго apk, который вы загружаете и выше). Поэтому убедитесь, что вы видите файл расширения apk в списке, когда вы нажимаете детали в разделе публикации для разработчиков в разделе APK.

ПРИМЕЧАНИЕ 2

Если вы используете студию Android и хотите использовать библиотеку загрузчика, не просто копируйте имя пакета и java-файлы в каталог src вашего собственного приложения. Импортируйте библиотеку загрузчика в eclipse и выберите экспорт => файлы сборки gradle. После этого вы можете импортировать библиотеку как модуль в Android Studio.

ПРИМЕЧАНИЕ 3

Не уверен в этом, но я также думаю, что необходимо загрузить приложение хотя бы один раз через магазин игр и иметь к нему доступ с учетной записью на тестовом устройстве. Поэтому, если вы работаете с альфа-версией, создайте тестовую группу Google+ и добавьте в нее себя или другие тестовые устройства.

Кстати

С этими библиотеками довольно легко реализовать загрузку расширения apk, просто убедитесь:

  1. ваша деятельность (та, где вы хотите реализовать загрузку пакета расширения, когда загрузка не была выполнена автоматически) реализует IDownloaderClient.

  2. вы настраиваете службу и приемник и настраиваете их в своем манифесте.

  3. BASE64_PUBLIC_KEY в классе обслуживания правильный. Загрузите первый apk => посмотрите Сервисы и API в консоли разработчика под своим приложением => Лицензионный код для этого приложения.

Этот код используется, чтобы узнать, можно ли найти файл расширения на устройстве:

boolean expansionFilesDelivered() {
    for (XAPKFile xf : xAPKS) {
        String fileName = Helpers.getExpansionAPKFileName(this, xf.mIsMain, xf.mFileVersion);
        Log.i(TAG, "Expansion filename " +fileName);
        if (!Helpers.doesFileExist(this, fileName, xf.mFileSize, false))
            return false;
    }
    return true;
}

Он использует класс XAPKS, который представляет файл расширения, будь то основной файл или файл исправления, имеющий определенный размер файла (байты) и связанный с версией apk (той, в которой он был впервые добавлен).

private static class XAPKFile {
        public final boolean mIsMain; // true
        public final int mFileVersion; //example 4
        public final long mFileSize; //example 126515695L
        // example => main expansion that was first introduced in apk version 4 and is 126515695 bytes in size

        XAPKFile(boolean isMain, int fileVersion, long fileSize) {
            mIsMain = isMain;
            mFileVersion = fileVersion;
            mFileSize = fileSize;
        }
    }

Также довольно легко читать файлы фильмов и другие материалы непосредственно из файла расширения с помощью инструментов zip, предоставленных Google (com.android.vending.zipfile).

Сначала получите файл расширения, используя методы, предусмотренные в библиотеке, пареметры — это целые числа, которые представляют вашу основную версию apk расширения (версию apk, в которую впервые был добавлен нужный вам пакет расширения) и версию apk исправления.

ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(context, APKX_MAIN_APK, APKX_PATCH_APK);

Видео

Для воспроизведения видео непосредственно из этого zipresourcefile:

AssetFileDescriptor a = expansionFile.getAssetFileDescriptor(pathToFileInsideZip);

Теперь из этого assetsFileDescriptor вы можете получить FileDescriptor и использовать его в своем медиаплеере, правильный синтаксис, чтобы заставить ваш медиаплеер воспроизводить видео, также требует второго и третьего параметра. Будь то начальное смещение и длина, которые вы можете получить из AssetFileDescriptor.

player.setDataSource(a.getFileDescriptor(), a.getStartOffset(), a.getLength());

Другое

Для всех остальных вещей (например, изображений) вы можете просто получить входной поток zipresourcefile:

expansionFile.getInputStream(pathToFileInsideZip);`

ТАКЖЕ убедитесь, что вы не сжимаете видео в zip, чтобы это работало! например, чтобы не сжимать файлы .mp4:

zip -n .mp4 -r zipfile.zip . -x ".*" -x "*/.*"
person Jordy    schedule 24.09.2014

Даже если это zip-файл, его все равно нужно хранить в папке obb.

person Abdulkarim Kanaan    schedule 22.03.2014