Android动态“按需”功能模块中的原始资源不能作为URI引用

问题描述 投票:1回答:1

我在将动态模块中的资源作为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”,并且包ID(在AndroidManifest中)与基本模块相同:“ com.redback`

android uri android-videoview android-resources dynamic-feature-module
1个回答
0
投票

Google开发者关系部门的答案已解决问题:

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()
© www.soinside.com 2019 - 2024. All rights reserved.