Android ExoPlayer 监听进度指南

在开发 Android 媒体应用时,ExoPlayer 是一个非常流行的选择。它不仅支持多种音视频格式,还提供了强大的监听机制,以便获取播放进度的信息。在本篇文章中,我们将一步步教你如何实现“Android ExoPlayer 监听进度”。

实现流程

我们可以将实现过程分为以下几个步骤:

步骤 说明
1. 添加 ExoPlayer 依赖 在项目的 build.gradle 文件中添加 ExoPlayer 依赖
2. 初始化 ExoPlayer 创建 ExoPlayer 实例并准备媒体资源
3. 设置进度监听器 通过 Player.Listener 来监听进度的变化
4. 更新 UI 在监听器中更新 UI 以反映当前播放进度
5. 释放资源 在 Activity 或 Fragment 销毁时释放 ExoPlayer 资源

详细实现步骤

1. 添加 ExoPlayer 依赖

首先,我们需要在项目的 build.gradle 文件中添加 ExoPlayer 的依赖。打开你的 app/build.gradle 文件,并在 dependencies 部分添加以下行:

implementation 'com.google.android.exoplayer:exoplayer:2.14.2'  // 引入 ExoPlayer 库

2. 初始化 ExoPlayer

接下来,我们需要初始化 ExoPlayer。可以在 ActivityFragmentonCreate 方法中完成:

ExoPlayer player = new ExoPlayer.Builder(context).build(); // 创建 ExoPlayer 实例
MediaItem mediaItem = MediaItem.fromUri(" // 媒体资源的 URI
player.setMediaItem(mediaItem); // 设置媒体资源
player.prepare(); // 准备开始播放

3. 设置进度监听器

我们可以通过实现 Player.Listener 接口来监听播放进度。确保在 Activity 中添加如下代码:

player.addListener(new Player.Listener() {
    @Override
    public void onPositionDiscontinuity(int reason) {
        super.onPositionDiscontinuity(reason);
        updateProgress(); // 进度更新时调用更新函数
    }

    @Override
    public void onPlaybackStateChanged(int playbackState) {
        if (playbackState == Player.STATE_READY) {
            // 播放器准备好可以播放
        }
    }

    @Override
    public void onPlayWhenReadyChanged(boolean playWhenReady, int reason) {
        // 播放状态变化时
    }
});

4. 更新 UI

onPositionDiscontinuity 方法中调用 updateProgress(),用于更新 UI 显示当前进度。实现如下:

private void updateProgress() {
    if (player != null) {
        long position = player.getCurrentPosition(); // 获取当前播放进度
        long duration = player.getDuration(); // 获取媒体总时长
        // 更新 UI 例如 SeekBar 或 TextView
        seekBar.setProgress((int) (position * 100 / duration)); // 更新 SeekBar 进度
    }
}

5. 释放资源

最后,在 ActivityFragmentonDestroy 方法中释放 Player 占用的资源:

@Override
protected void onDestroy() {
    super.onDestroy();
    player.release(); // 释放播放器资源
}

代码结构示意类图

classDiagram
    class ExoPlayer {
        +void addListener(Player.Listener listener)
        +void setMediaItem(MediaItem mediaItem)
        +void prepare()
        +void release()
    }
    class Player.Listener {
        +void onPositionDiscontinuity(int reason)
        +void onPlaybackStateChanged(int playbackState)
        +void onPlayWhenReadyChanged(boolean playWhenReady, int reason)
    }

进度监控示意饼状图

pie
    title 播放器各状态分布
    "Playing": 60
    "Paused": 20
    "Stopped": 15
    "Buffering": 5

结语

通过以上步骤,我们成功实现了 ExoPlayer 的进度监听功能。通过了解如何添加依赖、初始化播放器、设置监听器以及更新 UI,你已经掌握了一部分 Android 媒体播放的核心概念。希望这篇文章能帮助你在 Android 开发之路上更进一步,如果有任何问题,欢迎随时咨询!