2

動的モジュール内のリソースを 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」

4

1 に答える 1