无法读取/访问APK扩展(.obb)文件中的视频文件。它会抛出nullpointerexception

时间:2013-07-08 07:42:16

标签: android apk-expansion-files expansion-files

一直试图从我的apk扩展(.obb文件)中读取视频,但它似乎不起作用。已按照官方Android文档中提到的每个步骤进行操作。我正在使用示例应用程序(Android-sdk / extras / google / play_apk_expansion / downloader_sample中的Sample downloader应用程序)来测试我是否可以读取.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??
    
  5. 还试过以下(以防万一)

    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”&网络,但没有一个帮助。

2 个答案:

答案 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 - 也许你错过了文件路径中的内容。