我正在设置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
答案 0 :(得分:0)
解决方案:我需要使用
更改我的ZIP文件,以使其在不压缩的情况下构建。zip -Z store
一个大提示是,我意识到Android可以从压缩的.PNG而不是资产文件描述符中获取输入流。
文档暗示了这一要求,但事实有点难以捉摸。我错误地将其建议解释为意味着,在处理带有偏移量和持续时间的播放媒体(例如歌曲和电影)时,只需要避免压缩即可。但事实证明,压缩也会干扰检索图形文件。