即使我可以从ZipResourceFile对象读取,为什么我的“ content://” URI也返回空的InputStream?

时间:2019-01-01 17:52:06

标签: android inputstream apk-expansion-files

我正在设置Google的APEZProvider,以读取.PNG(压缩)和.MP3 (未压缩)来自APK扩展zip文件。如果我避免使用URI,并坚持使用“ getAPKExpansionZipFile()”,那么文件检索就可以正常工作。但是,当我尝试使用“ content://” API检索文件时,我得到了一个空InputStream。 (我需要URI才能满足媒体播放器的API。)

这是针对定位API 26的Android应用。过去,我能够使内容提供者正常工作。但是我已经坏了。我想知道模块版本不同步是否可能是个问题。

我尝试通过APEZProvider(Google为这种情况提供的ContentProvider的子类)跟踪断点。该应用程序找到了提供商O.K。没有任何logcat错误。所以我认为清单设置是正确的。

起初,APEZProvider似乎初始化O.K。它甚至可以找到zip文件并正确填充mAPKExpansionPack私有变量。但是以某种方式,当需要返回InputStream(在ContentProvider超类中)时,我得到了null。

在我的存储库中:

// This works fine
fun makeSureWeCanReadFromPack() {
     val stream = 
mExpansionPack?.getInputStream("images/species_bubo_bubo.png")
     val bitmap = BitmapFactory.decodeStream(stream)
     if (bitmap == null) {
        // This doesn't happen
        throw DodgyFileException("Couldn't read test image")
     }
}

// This throws an error
fun makeSureContentProviderIsUpAndRunning() {
    val uri = Uri.parse("content://com.company.app.provider.ZipFileContentProvider/images/species_bubo_bubo.png")
    val stream = mContext.getContentResolver().openInputStream(uri)
    val bitmap = BitmapFactory.decodeStream(stream)
    if (bitmap == null) {
        // This happens
        throw DodgyFileException("Couldn't read from content provider")
    }
}

在我的Android清单中:

<provider android:authorities="com.company.app.provider.ZipFileContentProvider"
android:name="com.company.app.provider.ZipFileContentProvider"
android:exported = "true"
android:multiprocess = "true"
android:enabled = "true"
>
</provider>

编辑:这是内容提供者:https://pastebin.com/UjMjtYCD

1 个答案:

答案 0 :(得分:0)

解决方案:我需要使用

更改我的ZIP文件,以使其在不压缩的情况下构建。
zip -Z store

一个大提示是,我意识到Android可以从压缩的.PNG而不是资产文件描述符中获取输入流。

文档暗示了这一要求,但事实有点难以捉摸。我错误地将其建议解释为意味着,在处理带有偏移量和持续时间的播放媒体(例如歌曲和电影)时,只需要避免压缩即可。但事实证明,压缩也会干扰检索图形文件。