Почему мой URI "content: //" возвращает нулевой InputStream, хотя я могу читать из объекта ZipResourceFile? - PullRequest
0 голосов
/ 01 января 2019

Я настраиваю 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

1 Ответ

0 голосов
/ 01 января 2019

Решение: мне нужно было изменить свой ZIP-файл так, чтобы он создавался без сжатия, используя

zip -Z store

. Когда я понял, что Android может получить входной поток из сжатого .PNG, я понял, что это очень важно., но не дескриптор файла актива.

Документация намекает на это требование, но правда немного неуловима.Я по ошибке истолковал его совет так, что вам нужно избегать сжатия только при работе с медиафайлами со смещением и длительностью, такими как песни и фильмы.Но оказывается, что сжатие может помешать получению графических файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...