Не удалось прочитать/доступ к видеофайлам внутри файла расширения APK (.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

Кроме того, в логарифме была еще одна ошибка, которую я мог пропустить ранее: -> «Не 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(expansionFiles), который, в свою очередь, вызывает addPatchFile(expansionFilePath), где отображается log--> «Не zip-архив», как показано выше во фрагменте кода. Итак, я предполагаю, что файл .obb должен быть преобразован в zip-файл (снова нулевое сжатие), что я и сделал, и переименовал файл obb в «main.6.com.example.expansion.downloader.obb.zip» (и по понятным причинам.Я также переименовал путь obb в коде на ‹...>.obb.zip). Сделав все это, теперь expansionFile не содержит нулевого значения, но моему AssetFileDescriptor afd по-прежнему присваивается нулевое значение. Ну, очевидно, этот подход кажется мне ошибочным (поскольку я думаю, что файл .obb не должен быть заархивирован в ‹..>.obb.zip. расширение.) Это тоже не сработало).

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

P.S.: Искал по всему "stackoverflow" и сети, но ни один из них не помог.


person epiphany27    schedule 08.07.2013    source источник
comment
Насколько я понимаю, файл .obb аналогичен zip-файлу, а это означает, что если вы запускаете инструмент JOBB для zip-файла, вы выполняете двойное сжатие. Вы должны либо заархивировать, либо запустить инструмент JOBB. Надеюсь это поможет.   -  person Dan Smart    schedule 19.02.2014


Ответы (2)


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

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

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

person Doug Gerecht    schedule 16.07.2013

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

person Stan    schedule 17.08.2014