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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:42:57