У меня проблемы с ссылкой на ресурсы в динамическом модуле в виде 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».