2

一直在尝试从我的 apk 扩展(.obb 文件)中读取视频,但它似乎不起作用。已按照官方 android 文档中提到的每个步骤进行操作。我正在使用示例应用程序(Android-sdk/extras/google/play_apk_expansion/downloader_sample 中的示例下载器应用程序)来测试我是否可以读取 .obb 文件。这就是我所做的。

  1. 从我的 .mp4 视频文件中创建压缩文件(零压缩)作为“videos.zip”。

  2. 使用 Android 'jobb' 工具成功创建了 .obb 文件。

  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 本身包含空值。

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

此外,我之前可能错过的 logcat 中还有一个错误:->“不是 Zip 存档”,它可以追溯到 ZipResourceFile.java 中的 addPatchFile(zipFilename) 方法。

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),它在此处显示日志->“不是 zip 存档”,如代码片段中所示。所以我想,.obb 文件应该被转换为我所做的 zip 文件(再次零压缩)并将 obb 文件重命名为“main.6.com.example.expansion.downloader.obb.zip”(并且出于显而易见的原因。我还将代码中的 obb-path 重命名为 <...>.obb.zip)。完成所有这些后,现在扩展文件不包含空值,但仍然是我的AssetFileDescriptor afd被赋予空值。好吧,显然这种方法对我来说似乎有缺陷(因为我认为 .obb 文件不应该压缩到 <..>.obb.zip。在压缩后也尝试使用相同的 obb 文件名(即,没有任何 .zip扩展名。)。它也不起作用)。

请帮忙。

PS:已经在“stackoverflow”和网络上查找了所有内容,但没有一个有帮助。

4

2 回答 2

1

我使用 StorageManager 类访问由 JOBB 创建的 obb 的成功有限。我还没有尝试过 APKExpansionSupport 类。StorageManager 内置于 Android 库中。

我说成功有限,因为大多数时候当我使用 mountObb() 挂载 obb 时不会调用 onObbStateChange()。但是,似乎确实正在安装obb。我可以在文件系统中看到它,我可以调用 getMountedObbPath() 来访问它。

我有时也无法访问 obb 中的文件。它安装但随后似乎是空的(这导致我到你的帖子)。这至少有一次在重建和下载新的 obb 后自行修复。我不知道为什么,但目前我再次无法访问内容。

于 2013-07-16T17:04:01.477 回答
0

也许这篇文章会帮助你,我猜它都是关于 ContentProvider 的,你不能在没有额外编码的情况下获取 obb zip 中视频文件的 URI。还要检查这篇文章- 也许你错过了文件路径中的某些内容。

于 2014-08-17T05:51:35.633 回答