Android使用MediaPlayer播放音频

Android使用MediaPlayer播放音频

开发《Android高仿iOS Messages声音播放波形效果》完成后,TapePlayView已经实现了音频播放功能。但是结合RecyclerView使用时,会出现控件被回收,但音频要继续播放的问题。

这种场景下,MediaPlayer播放功能不应该关联到控件,TapePlayView应该只显示播放波形。

一、目标

将播放功能从TapePlayView中分离出来,使音频播放的生命周期脱离控件的生命周期。

二、最终实现

TapePlayView已经实现了播放功能,只需要将代码分离处理即可。

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
public class AudioPlayer {

private int duration;
private boolean isPlaying = false;

private File targetFile;
private MediaPlayer mMediaPlayer = null;
private Consumer<AudioPlayer> mOnCompletionListener;

public AudioPlayer() {

}

public void setTarget(File file) {
this.targetFile = file;
}

public void setOnCompletionListener(Consumer<AudioPlayer> consumer) {
this.mOnCompletionListener = consumer;
}

public boolean start() {
if (targetFile == null) {
return false;
}

mMediaPlayer = new MediaPlayer();

try {
mMediaPlayer.setDataSource(targetFile.getAbsolutePath());
mMediaPlayer.prepare();
mMediaPlayer.setOnCompletionListener(this::onCompletion);
mMediaPlayer.setOnPreparedListener(mp -> mMediaPlayer.start());

this.duration = mMediaPlayer.getDuration();
} catch (IOException e) {
e.printStackTrace();

mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer.release();
mMediaPlayer = null;
}

boolean result = (mMediaPlayer != null);
this.isPlaying = result;

return result;
}

public void stop() {
this.isPlaying = false;
this.duration = 0;

if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer.release();
mMediaPlayer = null;
}
}

public void resume() {
if (mMediaPlayer != null) {
this.isPlaying = true;

mMediaPlayer.start();
}
}

public void pause() {
this.isPlaying = false;

if (mMediaPlayer != null) {
mMediaPlayer.pause();
}
}

public boolean isRunning() {
return (mMediaPlayer != null);
}

public boolean isPlaying() {
return this.isPlaying;
}

public int getDuration() {
if (mMediaPlayer == null) {
return this.duration;
}

return mMediaPlayer.getDuration();
}

public int getCurrentPosition() {
if (mMediaPlayer == null) {
return 0;
}

return mMediaPlayer.getCurrentPosition();
}

public MediaPlayer getMediaPlayer() {
return this.mMediaPlayer;
}

void onCompletion(MediaPlayer mp) {
this.stop();

if (mOnCompletionListener != null) {
mOnCompletionListener.accept(this);
}
}

}

三、接下来

目前为止,已经实现了录音编辑器功能以及播放功能。

接下来需要处理的是声音相关的问题,包括

  1. 调高、调低音量
  2. 切换话筒、扬声器播放
  3. 靠近耳朵时自动切换到话筒播放
  4. 非播放时,靠近耳朵启动录音编辑器
  5. ……

四、Finally

稽首三界尊,皈依十方佛。 我今发宏愿,持此金刚经。 上报四重恩,下济三途苦。 若有见闻者,悉发菩提心。 尽此一报身,同生极乐国。