MediaPlayer setDataSource для расширенияFilePath не работает

Я пытаюсь загрузить фильм из файла в смонтированном файле OBB расширения Google Play APK.

mMediaPlayer = new MediaPlayer();

StorageManager storageManager = (StorageManager)mParentActivity.getSystemService(Context.STORAGE_SERVICE);

String obbPath = ExpansionHelper.getExpansionFilePath(mParentActivity);
File movie = new File(storageManager.getMountedObbPath(obbPath), filename);

Log.d(Constants.TAG, "Movie exists is " + movie.exists());

mMediaPlayer.setDataSource(obbPath);

Примечание: фильм существует в журнале «true»

E/MediaPlayer(27155): Ошибка (1,-2147483648) Ошибка при открытии файла. Выгрузка медиаплеера (Неизвестная ошибка медиаплеера, -2147483648) E/MediaPlayer(27155): стоп вызывается в состоянии 0 E/MediaPlayer(27155): ошибка (-38, 0)

Как я могу воспроизвести фильм из файла расширения APK OBB (не в формате zip)?


person Sander Versluys    schedule 03.07.2013    source источник
comment
Возникла такая же проблема в версии Android 2.3.x, но она хорошо работает в более поздней версии. На какой версии Android вы столкнулись с этой проблемой?   -  person Nicolas Lauquin    schedule 04.03.2015


Ответы (2)


Я не совсем уверен, почему этот метод работает, но если вы предоставляете FileDescriptor из FileInputStream, он работает как шарм!

FileInputStream fis = new FileInputStream(movie);
mMediaPlayer.setDataSource(fis.getFD());
fis.close();
person Sander Versluys    schedule 03.07.2013

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

private static void setMediaPlayerDataSourceFromZip(MediaPlayer mediaPlayer,
        String zipFileName, String fileNameInZip) throws IOException,
        FileNotFoundException {
    ZipResourceFile zip = new ZipResourceFile(zipFileName);
    FileInputStream fis = new FileInputStream(zipFileName);
    try {
        FileDescriptor zipfd = fis.getFD();

        ZipEntryRO entry = zipFindFile(zip, fileNameInZip);
        mediaPlayer.setDataSource(zipfd, entry.mOffset,
                entry.mUncompressedLength);
    } finally {
        fis.close();
    }
}

private static ZipEntryRO zipFindFile(ZipResourceFile zip, String fileNameInZip) {
    for (ZipEntryRO entry : zip.getAllEntries()) {
        if (entry.mFileName.equals(fileNameInZip))
            return entry;
    }
    throw new RuntimeException(String.format("File \"%s\"not found in zip", fileNameInZip));
}

Использование:

setMediaPlayerDataSourceFromZip(mediaPlayer,
   "/Some/zip/obb/withoutCompression.zip",
   "path/within/zip/mymovie.mp4");
person weston    schedule 22.07.2014