一直在尝试从我的 apk 扩展(.obb 文件)中读取视频,但它似乎不起作用。已按照官方 android 文档中提到的每个步骤进行操作。我正在使用示例应用程序(Android-sdk/extras/google/play_apk_expansion/downloader_sample 中的示例下载器应用程序)来测试我是否可以读取 .obb 文件。这就是我所做的。
从我的 .mp4 视频文件中创建压缩文件(零压缩)作为“videos.zip”。
使用 Android 'jobb' 工具成功创建了 .obb 文件。
将 obb 文件 (main.6.com.example.expansion.downloader.obb) 放在 /sdcard/Android/obb/com.example.expansion.downloader/ 中。
创建了一个新的 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”和网络上查找了所有内容,但没有一个有帮助。