Необработанный ресурс, находящийся в функциональном модуле Android Dynamic «по требованию», не может указываться как URI

У меня проблемы с ссылкой на ресурсы в динамическом модуле в виде URI.

Что-то вроде этого:

android.resource://com.redback.dynamic_module/raw/cool_video

не кажется действительным.

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

// Playing a raw sound works fine

val soundRawResId = dynamicModuleResourceProvider.coolSound() // sound file is a raw resource in the dynamic feature module
val asset: AssetFileDescriptor = resources.openRawResourceFd(resId)
mediaPlayer.setDataSource(asset.fileDescriptor, asset.startOffset, asset.length) }
mediaPlayer.prepareAsync() 

// Sound plays!

Кажется, что модуль и ресурсы загружены нормально.

Однако мне также нужно передать некоторые необработанные ресурсы в VideoView. Для этого мне нужно сгенерировать URI:

val videoRawResId = dynamicModuleResourceProvider.coolVideo()

val uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(resources.getResourcePackageName(resId))
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(resources.getResourceEntryName(resId))
                .build()

// This builds a uri that looks like this: 

/// `android.resource://com.redback.dynamic_module/raw/cool_video`

// But throws an exception:

// Couldn't open android.resource://com.redback.dynamic_module/raw/cool_video
    java.io.FileNotFoundException: No resource found for: android.resource://com.redback.dynamic_module/raw/cool_video

Я пробовал жестко закодировать несколько вариантов URI:

android.resource://com.redback/raw/cool_video

android.resource://dynamic_module/raw/cool_video

но безрезультатно ...

Этот VideoView без проблем работал до перемещения ресурсов в модуль динамических функций по требованию, и по-прежнему работает нормально, если я использую видео из базового модуля. Это наводит на мысль, что, возможно, URI просто нужно построить по-другому?

На данный момент обходной путь - записать ресурс в файл и передать файл VideoView .., что, конечно, далеко не идеально, но демонстрирует, что ресурс загружен и доступен.

            val name = resources.getResourceEntryName(resId)
            val file = File(context.cacheDir, name)
            if (!file.exists()) {
                val resourceStream = resources.openRawResource(resource.res)
                copyStreamToFile(resourceStream, file)
            }

            setVideoPath(file.absolutePath)

Динамический модуль называется «dynamic_module», а идентификатор пакета (в AndroidManifest) такой же, как и у базового модуля: «com.redback».


person shredder    schedule 05.12.2019    source источник


Ответы (1)


Ответ от Google Developer Relations устранил проблему:

val uri = Uri.Builder()
                .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
                .authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
                .appendPath(resources.getResourceTypeName(resId))
                .appendPath(String.format("%s:%s", resources.getResourcePackageName(resId), resources.getResourceEntryName(resId))) // Look up the dynamic resource in the split namespace.
                .build()
person shredder    schedule 09.04.2020