Запутался в том, как получить доступ к файлам из ZipResourceFile (файл с расширением APK)

В моем приложении очень много изображений, поэтому мне нужно предоставить файлы расширения с моим APK. Я решил хранить все свои изображения в ZIP-файле и использовать zip библиотека, чтобы получить доступ к моим изображениям.

Моей первой интуицией было разархивировать все файлы при первом запуске приложения и сохранить их во внешнем каталоге приложения. Гид мягко подталкивает меня к другому подходу:

Чтение медиафайлов из ZIP

Если вы используете файлы расширения для хранения медиафайлов, ZIP-файл по-прежнему позволяет вам использовать вызовы воспроизведения медиафайлов Android, которые предоставляют элементы управления смещением и длиной (например, MediaPlayer.setDataSource() и SoundPool.load()). Чтобы это работало, вы не должны выполнять дополнительное сжатие медиафайлов при создании ZIP-пакетов.

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

Предположим, у меня есть активность галереи с ViewPager, которая показывает одно изображение на странице. Открывать ли ZIP-файл расширения в onCreate и закрывать его в onDestroy, или открывать и закрывать файл для каждого нового загружаемого изображения?


person Maarten    schedule 05.02.2014    source источник


Ответы (1)


Начиная с уровня API 9, вы можете использовать инструмент jobb для упаковки ваших ресурсов и используйте StorageManager для монтирования/демонтажа OBB-файла. Вы также можете использовать этот инструмент для шифрования активов, если это необходимо.

OBB — это хороший способ предоставления больших объемов двоичных активов без упаковки их в APK, поскольку они могут иметь размер в несколько гигабайт. Однако из-за их размера они, скорее всего, хранятся в общем пуле хранения, доступном для всех программ.

...

OBB будет оставаться смонтированным до тех пор, пока ссылка StorageManager удерживается приложением. Как только эта ссылка будет потеряна, используемые OBB будут размонтированы. OnObbStateChangeListener, зарегистрированный с этим вызовом, получит информацию об успехе или неудаче этой операции.

Я предполагаю, что смонтированный OBB-файл может размонтироваться в любой неожиданный момент (например, когда пользователь включает USB-накопитель), поэтому обратите особое внимание на свой OnObbStateChangeListener.

Пример из этого вопроса:

storage = (StorageManager) getSystemService( STORAGE_SERVICE );
storage.mountObb( obbFilepath, "optional_encryption_key", myListener );

Вы можете использовать obbContentPath для чтения файлов так же, как если бы они были на диске.

private final OnObbStateChangeListener myListener = new OnObbStateChangeListener() {
    @Override
    public void onObbStateChange(String path, int state) {
        super.onObbStateChange(path, state);
        d(path + " changed to state " + state);
        switch (state) {
            case ERROR_ALREADY_MOUNTED:
            case ERROR_COULD_NOT_MOUNT:
            case ERROR_COULD_NOT_UNMOUNT:
            case ERROR_INTERNAL:
            case ERROR_NOT_MOUNTED:
            case ERROR_PERMISSION_DENIED:
            case UNMOUNTED:
                //TODO
                break;
            case MOUNTED:
                String assetsPath = mStorageManager.getMountedObbPath(mPathToObb);
                if (assetsPath == null) throw new NullPointerException("Could not get path to mounted OBB path");
                d("Checking if " + assetsPath + "/path/to/file exists");
                File f = new File(assetsPath + "/path/to/file");
                d("" + f.exists());                    
                break;
            default:
                break;
        }
    }
};
person Maarten    schedule 05.02.2014