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
相关产品推荐
相关产品推荐

