仿微信语音消息的录制和播放
一、简述
效果:
实现功能:
- 长按Button时改变Button显示文字,弹出Dialog(动态更新音量),动态生成录音文件,开始录音;
- 监听手指动作,规定区域。录音状态下手指划出规定区域取消录音,删除生成的录音文件;
- 监听手指动作。当手指抬起时,判断是否开始录音,录音时长是否过短,符合条件则提示录音时长过短;正常结束时通过回调返回该次录音的文件路径和时长。
4.点击录音列表的item时,播放动画,播放对应的音频文件。
主要用到4个核心类:
- 自定义录音按钮(AudioRecordButton);
- 弹框管理类(DialogManager);
- 录音管理类(AudioManager)。
1.AudioRecordButton状态:
- 1.STATE_NORMAL:普通状态
- 2.STATE_RECORDING:录音中
- 3.STATE_CANCEL:取消录音
2.DialogManager状态:
- 1.RECORDING:录音中
- 2.WANT_TO_CANCEL:取消录音
- 3.TOO_SHORT:录音时间太短
3.AudioManager:
- 1.prepare():准备状态
- 2.cancel():取消录音
- 3.release():正常结束录音
- 4.getVoiceLevel():获取音量
核心逻辑:
自定义Button,重写onTouchEvent()方法。
伪代码:
class AudioRecorderButton{
onTouchEvent(){
DOWN:
changeButtonState(STATE_RECORDING);
| DialogManager.showDialog(RECORDING)
触发LongClick事件(AudioManager.prepare() --> end prepared --> | );
| getVoiceLevel();//开启一个线程,更新Dialog上的音量等级
MOVE:
if(wantCancel(x,y)){
DialogManager.showDialog(WANT_TO_CANCEL);更新Dialog
changeButtonState(STATE_WANT_TO_CANCEL);更新Button状态
}else{
DialogManager.showDialog(WANT_TO_CANCEL);
changeButtonState(STATE_RECORDING);
}
UP:
if(wantCancel == curState){//当前状态是想取消状态
AudioManager.cancel();
}
if(STATE_RECORDING = curState){
if(tooShort){//判断录制时长,如果录制时间过短
DialogManager.showDialog(TOO_SHORT);
}
AudioManager.release();
callbackActivity(url,time);//(当前录音文件路径,时长)
}
}
}
二、MediaManager封装
简述:使用MediaPlayer播放录制好的音频文件,要注意MediaPlayer资源的释放。更多关于MediaPlayer的知识参考【MediaPlayer】的使用。点击此处跳转
代码:
import android.media.*;
import java.io.IOException;
/**
* 播放管理类
*/
public class MediaManager {
private static MediaPlayer mMediaPlayer;
private static boolean isPause;
public static void playSound(String filePath, MediaPlayer.OnCompletionListener onCompletionListener) {
if (mMediaPlayer == null) {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
mMediaPlayer.reset();
return false;
}
});
} else {
mMediaPlayer.reset();
}
try {
mMediaPlayer.setAudioStreamType(android.media.AudioManager.STREAM_MUSIC);
mMediaPlayer.setOnCompletionListener(onCompletionListener);
mMediaPlayer.setDataSource(filePath);
mMediaPlayer.prepare();
mMediaPlayer.start();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void pause(){
if(mMediaPlayer != null && mMediaPlayer.isPlaying()){
mMediaPlayer.pause();
isPause = true;
}
}
public static void resume(){
if(mMediaPlayer != null && isPause){
mMediaPlayer.start();
isPause = false;
}
}
public static void release(){
if(mMediaPlayer != null){
mMediaPlayer.release();
mMediaPlayer = null;
}
}
}
三、DialogManager封装
封装了6个方法:
1. showRecordingDialog():用来设置Diaog布局,拿到控件的引用,显示Dialog。
2. recording():更改Dialog状态为录音中状态。
3. wantToCancel():更改Dialog状态为想要取消状态。
4. tooShort():更改Dialog状态为录音时长过短状态。
5. dismissDialog():移除Dialog。
6. updateVoiceLevel():用来更新音量图片。
代码:
import android.app.Dialog;
import android.content.Context;
import android.v