Не удалось прочитать / получить доступ к видеофайлам внутри файла APK Expansion (.obb). Это выбрасывает nullpointerexception

Пыталась прочитать видео с моего расширения apk (файл.obb), но, похоже, оно не работает. Следуйте каждому шагу, упомянутому в официальных документах Android. Я использую пример приложения (пример приложения для загрузки в Android-sdk/extras/google/play_apk_expansion/downloader_sample), чтобы проверить, могу ли я прочитать файл.obb. Это то, что я сделал.

  1. Создал заархивированный файл (с нулевым сжатием) из моих видеофайлов.mp4 как "videos.zip".

  2. Успешно создан файл.obb с помощью инструмента Android "jobb".

  3. Поместил файл obb (main.6.com.example.expansion.downloader.obb) в /sdcard/Android/obb/com.example.expansion.downloader/ .

  4. Создан новый класс MediaPlayerActivity (MediaPlayerActivity.java), где я пытаюсь воспроизвести видеофайл внутри файла.obb.

    expansionFile = APKExpansionSupport.getAPKExpansionZipFile(this,
                    6, 0);     
    .....
    .....
    .....
    AssetFileDescriptor afd = expansionFile.getAssetFileDescriptor("sample1.mp4"); //nullpointerexception at this line.
    Log.i("afd: ", ""+afd); //afd is null. How come??
    

Также попробовал следующее (на всякий случай)

expansionFile.getAssetFileDescriptor("videos/sample1.mp4"). But it gives the same nullpointerexception. 

Пожалуйста, помогите людям.

Спасибо!

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

expansionFile = APKExpansionSupport.getAPKExpansionZipFile(this,
            6, 0);     
Log.i("expansionFile: ", ""+expansionFile); //--> expansionFile is null

Кроме того, в logcat была еще одна ошибка, которую я мог пропустить ранее:-> "Не Zip-архив", которая прослеживает свое существование до метода addPatchFile(zipFilename) в ZipResourceFile.java.

int header = read4LE(f);
    if (header == kEOCDSignature) {
        Log.i(LOG_TAG, "Found Zip archive, but it looks empty");
        throw new IOException();
    } else if (header != kLFHSignature) {
        Log.v(LOG_TAG, "Not a Zip archive");
        throw new IOException();
    }

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

APKExpansionSupport.getAPKExpansionZipFile(...), в свою очередь, вызывает getResourceZipFile(extensionFiles), который, в свою очередь, вызывает addPatchFile(extensionFilePath), где он показывает журнал -> "Не zip-архив", как показано выше в фрагменте кода. Поэтому я полагаю, что файл.obb должен быть преобразован в zip-файл (опять же, с нулевым сжатием), что я и сделал и переименовал файл obb в "main.6.com.example.expansion.downloader.obb.zip" (и по понятным причинам. Я также переименовал obb-путь в коде в <...>.obb.zip). Сделав все это, теперь extensionFile не содержит нулевого значения, но все же моему AssetFileDescriptor afd присвоено нулевое значение. Ну, очевидно, этот подход мне кажется ошибочным (поскольку я думаю, что файл.obb не должен быть заархивирован в <..>. Obb.zip. Также пытался с тем же именем файла obb после архивирования (то есть, без.zip расширение.). Это тоже не сработало).

Пожалуйста помоги.

PS: просматривал все "стека и потока", но ни один из них не помог.

2 ответа

Я имел ограниченный успех, используя класс StorageManager для доступа к объекту, созданному JOBB. Я не пробовал класс APKExpansionSupport. StorageManager встроен в библиотеки Android.

Я говорю ограниченный успех, потому что большую часть времени onObbStateChange() не вызывается, когда я монтирую obb с помощью mountObb(). Тем не менее, кажется, что OBB монтируется. Я могу видеть это в файловой системе, и я могу вызвать getMountingObbPath() для доступа к нему.

Я также иногда не могу получить доступ к файлам в OBB. Он монтируется, но затем кажется пустым (что привело меня к вашему сообщению). Это, по крайней мере, один раз, исправило себя после восстановления и загрузки нового объекта. Я понятия не имею, почему, но в данный момент я снова не могу получить доступ к содержимому.

Может быть, этот пост поможет вам, я думаю, это все о ContentProvider, и вы не можете просто получить URI для видеофайла внутри zip-файла obb без некоторого дополнительного кодирования. Также проверьте этот пост - возможно, вы что-то упустили в пути к файлу.

Другие вопросы по тегам