一直试图从我的apk扩展(.obb文件)中读取视频,但它似乎不起作用。已按照官方Android文档中提到的每个步骤进行操作。我正在使用示例应用程序(Android-sdk / extras / google / play_apk_expansion / downloader_sample中的Sample downloader应用程序)来测试我是否可以读取.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.
请帮助别人。
谢谢!
编辑: 我想我可能找到了错误的根源。但仍然不知道如何解决它。实际上,expandFile本身包含空值。
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)。完成所有这些后,现在 expansionFile 不包含空值,但我的 AssetFileDescriptor afd 仍然被赋予空值。嗯,显然这种方法对我来说似乎有缺陷(因为我认为.obb文件不应该压缩到< ..> .obb.zip。在压缩后也尝试使用相同的obb文件名(即,没有任何.zip扩展名。)。它也不起作用。)
请帮忙。
P.S。:已经查看了所有“stackoverflow”&网络,但没有一个帮助。
答案 0 :(得分:1)
使用StorageManager类访问JOBB创建的obb我的成功有限。我还没有尝试过APKExpansionSupport类。 StorageManager内置于Android库中。
我说成功有限,因为当我使用mountObb()挂载obb时,大多数时候onObbStateChange()都没有被调用。但是,似乎obb正在安装。我可以在文件系统中看到它,我可以调用getMountedObbPath()来访问它。
我偶尔也无法访问obb中的文件。它安装但似乎是空的(这导致我你的帖子)。在重建和下载新的obb之后,这至少有一次自我修复。我不明白为什么,但此刻我又一次无法访问内容。
答案 1 :(得分:0)
Maybe this post will help you我猜这完全与ContentProvider有关,你不能只是在obb zip中获取视频文件的URI而不需要额外的编码。还要检查this post - 也许你错过了文件路径中的内容。