You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android平板:如何用VideoView或ExoPlayer播放Asset Pack中的视频

解决Play Asset Delivery中Asset Pack视频的播放问题

首先要明确:Play Asset Delivery的Asset Pack文件不能直接通过assets://路径访问,它们下载后会存储在应用的内部私有目录中,必须通过AssetPackManager获取正确的文件路径后才能播放。另外,必须确保Asset Pack已经完成下载并处于可用状态,否则会导致黑屏或播放失败。

优先方案:使用ExoPlayer播放

ExoPlayer对本地文件的支持更灵活,步骤如下:

1. 检查Asset Pack状态并获取路径

先初始化AssetPackManager,监听Asset Pack的下载状态,确认完成后获取其存储路径:

import com.google.android.play.core.assetpacks.AssetPackManager
import com.google.android.play.core.assetpacks.AssetPackManagerFactory
import com.google.android.play.core.assetpacks.AssetPackStatus
import com.google.android.play.core.assetpacks.model.AssetPackErrorCode

// 初始化AssetPackManager
val assetPackManager = AssetPackManagerFactory.create(context)
val packName = "你的Asset Pack名称" // 对应build.gradle中配置的asset pack名称

// 发起Asset Pack请求(如果未下载)
assetPackManager.fetch(listOf(packName)).addOnCompleteListener { task ->
    if (task.isSuccessful) {
        // 监听下载状态
        assetPackManager.registerListener { state ->
            if (state.packName == packName) {
                when (state.status()) {
                    AssetPackStatus.SUCCESS -> {
                        // 获取Asset Pack的根路径
                        val packLocation = assetPackManager.getPackLocation(packName)
                        val assetsRootPath = packLocation?.assetsPath() ?: return@registerListener
                        // 拼接视频文件路径
                        val videoFile = File(assetsRootPath, "video.mp4")
                        // 调用ExoPlayer播放
                        playVideoWithExoPlayer(context, videoFile)
                    }
                    AssetPackStatus.FAILED -> {
                        val errorCode = state.errorCode()
                        // 处理下载失败,比如提示用户重试
                    }
                    // 处理其他状态(如下载中、等待中)
                }
            }
        }
    } else {
        // 处理请求失败
    }
}

2. ExoPlayer播放实现

import com.google.android.exoplayer2.ExoPlayer
import com.google.android.exoplayer2.MediaItem
import com.google.android.exoplayer2.ui.StyledPlayerView

fun playVideoWithExoPlayer(context: Context, videoFile: File) {
    val playerView = findViewById<StyledPlayerView>(R.id.player_view)
    val player = ExoPlayer.Builder(context).build()
    playerView.player = player

    // 构建MediaItem
    val mediaItem = MediaItem.fromUri(Uri.fromFile(videoFile))
    player.setMediaItem(mediaItem)

    // 准备并播放
    player.prepare()
    player.play()
}

备选方案:使用VideoView播放

VideoView需要正确的文件Uri,核心同样是获取Asset Pack的有效路径:

fun playVideoWithVideoView(context: Context, videoFile: File) {
    val videoView = findViewById<VideoView>(R.id.video_view)
    val videoUri = Uri.fromFile(videoFile)
    
    videoView.setVideoURI(videoUri)
    // 添加媒体控制器
    videoView.setMediaController(MediaController(context))
    videoView.requestFocus()
    
    videoView.setOnPreparedListener { mp ->
        // 准备完成后播放
        mp.start()
    }
    
    videoView.setOnErrorListener { mp, what, extra ->
        // 处理播放错误
        true
    }
}

常见问题排查

  • 黑屏问题:大概率是Asset Pack未完成下载就尝试访问,或者路径拼接错误。可以通过打印videoFile.exists()确认文件是否存在。
  • Asset Pack配置错误:检查build.gradle中asset pack的配置是否正确,确保视频文件被正确打包到Asset Pack中(注意Asset Pack的目录结构,比如视频放在asset pack的assets目录下)。
  • 权限问题:Asset Pack存储在应用内部私有目录,无需额外存储权限,但若手动修改路径可能触发权限问题,避免使用外部存储路径。

内容的提问来源于stack exchange,提问作者Philip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 22:25:17