ExoPlayer 2.19中StyledPlayerView已废弃,求迁移至Media3的示例代码
AndroidX Media3 替代废弃的 ExoPlayer StyledPlayerView 迁移示例
1. 添加 Media3 依赖
在模块级 build.gradle 中引入 Media3 核心库:
dependencies { // Media3 核心播放器 implementation "androidx.media3:media3-exoplayer:1.2.1" // Media3 UI 组件(对应原StyledPlayerView) implementation "androidx.media3:media3-ui:1.2.1" // 如需支持HLS等特殊格式,可添加对应扩展 // implementation "androidx.media3:media3-exoplayer-hls:1.2.1" }
2. 修改 XML 布局
直接替换组件包名即可,原有 XML 属性完全兼容:
<androidx.media3.ui.StyledPlayerView android:id="@+id/player_view" android:layout_width="match_parent" android:layout_height="match_parent" app:show_buffering="when_playing" app:show_shuffle_button="true" app:surface_type="texture_view" app:use_controller="false" />
3. 适配 Java 逻辑代码
Media3 API 与旧版 ExoPlayer 高度相似,仅包名调整,以下是完整适配后的代码:
import androidx.media3.common.MediaItem; import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.ui.StyledPlayerView; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; public class PlayerActivity extends AppCompatActivity { private ExoPlayer player; private StyledPlayerView playerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_player); playerView = findViewById(R.id.player_view); // 初始化Media3版ExoPlayer player = new ExoPlayer.Builder(this).build(); playerView.setPlayer(player); // 方式1:通过资源ID直接创建媒体项(更简洁) MediaItem mediaItem = MediaItem.fromResourceId(this, R.raw.ok); // 方式2:保留原Uri写法 // String path = "android.resource://" + getPackageName() + "/" + R.raw.ok; // MediaItem mediaItem = MediaItem.fromUri(path); player.setMediaItem(mediaItem); player.prepare(); player.play(); } // 必须管理播放器生命周期,避免资源泄漏 @Override protected void onStart() { super.onStart(); if (player != null) player.play(); } @Override protected void onPause() { super.onPause(); if (player != null) player.pause(); } @Override protected void onDestroy() { super.onDestroy(); if (player != null) { player.release(); player = null; } } }
关键注意点
- 包名迁移:旧版
com.google.android.exoplayer2下的类,全部迁移至androidx.media3对应子包(例如ExoPlayer现在位于androidx.media3.exoplayer) - 生命周期处理:播放器资源占用高,必须在Activity的
onPause、onDestroy方法中暂停、释放播放器,避免内存泄漏和异常 - 属性兼容性:原布局中设置的所有属性,在Media3的
StyledPlayerView中均可直接复用,无需调整
内容的提问来源于stack exchange,提问作者Alex Advent
相关产品推荐
相关产品推荐

