这是MediaPlayer的关键生命周期,这张图是关键,他可以帮你很好的理解如何使用MediaPlayer
![](https://image.zfxt.top/hexo-blog/Android MediaPlayer-2023-12-23-24-02.png)

MediaPlayer的常用方法

| Public Methods |
| — | — |
| static MediaPlayer | create(Context context, Uri uri, SurfaceHolder holder)指定从资源ID对应的资源文件中来装载音乐文件,同时指定了SurfaceHolder对象并返回MediaPlyaer对象。 |
| static MediaPlayer | create(Context context, int resid)指定从资源ID对应的资源文件中来装载音乐文件,并返回新创建的MediaPlyaer对象。 |
| static MediaPlayer | create(Context context, Uri uri)从指定Uri装在音频文件,并返回新创建的MediaPlayer对象。 |
| int | getCurrentPosition()获取当前播放的位置。 |
| int | getDuration()获取音频的时长。 |
| int | getVideoHeight()获取视频的高度。 |
| int | getVideoWidth()获取视频的宽度。 |
| boolean | isLooping()判断MediaPlayer是否正在循环播放。 |
| boolean | isPlaying()判断MediaPlayer是否正在播放。 |
| void | pause()暂停播放。 |
| void | prepare()准备播放(装载音频),调用此方法会使MediaPlayer进入Prepared状态。 |
| void | prepareAsync()准备播放异步音频。 |
| void | release()释放媒体资源。 |
| void | reset()重置MediaPlayer进入未初始化状态。 |
| void | seekTo(int msec)寻找指定的时间位置。 |
| void | setAudioStreamType(int streamtype)设置音频流的类型。 |
| void | setDataSource(String path)指定装载path路径所代表的文件。 |
| void | setDataSource(Context context, Uri uri, Map<String, String headers)指定装载uri所代表的文件。 |
| void | setDataSource(Context context, Uri uri)指定装载uri所代表的文件。 |
| void | setDataSource(FileDescriptor fd, long offset, long length)指定装载fd所代表的文件中从offset开始长度为length的文件内容。 |
| void | setDataSource(FileDescriptor fd)指定装载fd所代表的文件。 |
| void | setDisplay(SurfaceHolder sh)设置显示方式。 |
| void | setLooping(boolean looping)设置是否循环播放。 |
| void | setNextMediaPlayer(MediaPlayer next)设置当前流媒体播放完毕,下一个播放的MediaPlayer。 |
| void | setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener)注册一个回调函数,在网络视频流缓冲变化时调用。 |
| void | setOnCompletionListener(MediaPlayer.OnCompletionListener listener)为Media Player的播放完成事件绑定事件监听器。 |
| void | setOnErrorListener(MediaPlayer.OnErrorListener listener)为MediaPlayer的播放错误事件绑定事件监听器。 |
| void | setOnPreparedListener(MediaPlayer.OnPreparedListener listener)当MediaPlayer调用prepare()方法时触发该监听器。 |
| void | setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener)当MediaPlayer调用seek()方法时触发该监听器。 |
| void | setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener)注册一个用于监听视频大小改变的监听器。 |
| void | setScreenOnWhilePlaying(boolean screenOn)置是否使用SurfaceHolder来显示。 |
| void | setSurface(Surface surface)设置Surface。 |
| void | setVideoScalingMode(int mode)设置视频缩放的模式。 |
| void | setVolume(float leftVolume, float rightVolume)设置播放器的音量。 |
| void | setWakeMode(Context context, int mode)为MediaPlayer设置低级电源管理行为。. |
| void | start()开始或恢复播放。 |
| void | stop()停止播放。 |

这是我的写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

class AudioPlayerImpl(
private val app: Application
) : AudioPlayer {
private var _mediaPlayer: MediaPlayer? = null


override fun play(uri: String?) {
if (_mediaPlayer == null) {
_mediaPlayer = MediaPlayer().apply {
setDataSource(app, android.net.Uri.parse(uri))
prepare()
start()
}
} else {
uri?.let {
release()
_mediaPlayer = MediaPlayer().apply {

setDataSource(app, android.net.Uri.parse(uri))
prepare()
}
}
_mediaPlayer?.apply {

start()
}

}
}

override fun pause() {
_mediaPlayer?.pause()
}

override fun release() {
_mediaPlayer?.stop()
_mediaPlayer?.release()
_mediaPlayer = null
}
}

引用自csdn