Я настраиваю Google APEZProvider для чтения файлов .PNG (сжатых) и .MP3 (не сжатых) из ZIP-файла расширения APK.Восстановление файлов работает очень хорошо, если я избегаю URI и придерживаюсь «getAPKExpansionZipFile ()» Но когда я пытаюсь получить мои файлы с помощью API «content: //», я получаю нулевой InputStream.(Мне нужен URI, чтобы удовлетворить API-интерфейсы медиаплееров.)
Это для приложения Android, ориентированного на API 26. В прошлом мне удавалось заставить работать контент-провайдера.Но я что-то сломал.Интересно, может ли это быть проблема с несинхронизированными версиями модуля.
Я пытался установить точку останова через APEZProvider (подкласс ContentProvider, который Google предоставляет для этого случая.) Приложение находит провайдера.ОК без какой-либо ошибки logcat.Поэтому я считаю, что мои настройки манифеста верны.
Сначала APEZProvider, кажется, инициализируется ОК. Он даже находит zip-файлы и правильно заполняет приватную переменную mAPKExpansionPack.Но почему-то, когда пришло время вернуть InputStream (в суперклассе ContentProvider), я получаю нулевое значение.
В моем хранилище:
// 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