手指按下开始录音,松开后停止录音,点击按钮可以进行声音的播放或删除等
前段时间需要做到声音的录制和播放,百度出来的例子都是千遍一律的雷同啊,并且各种问题,比如不能重复录制、播放等问题。其实主要问题是MediaRecorder和MediaPlayer各种状态没有搞清楚所致,本文整理了思路和代码实例,希望真正忙到有这需求的同学!
声音录制节点
本例使用的是MediaRecorder,初始化很简单
private void initializeAudio() {
// new出MediaRecorder对象
recorder = new MediaRecorder();
// 设置MediaRecorder的音频源为麦克风
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
// 设置MediaRecorder录制的音频格式
recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
// 设置MediaRecorder录制音频的编码为amr.
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// 设置录制好的音频文件保存路径
recorder.setOutputFile(filePath);
}
开始录制准备,其实是初始化mediaPlayer状态
private void startRecord() {
try {
recorder.prepare();// 准备录制
recorder.start();// 开始录制
// 必须reset,否则不能成功播放
mediaPlayer.reset();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
开始录音相关逻辑处理
private void handleStartRecord() {
//停止所有播放
MediaPlayerManager.getInstance().stopAllSound(mediaPlayerList);
//判断是否录音,如果录音,则在退出该界面时上传七牛
if (!isRecorded) {
isRecorded = true;
}
sound_mic.setImageResource(R.drawable.sound_mic2);
sound_show.setText("");
//开启倒计时
countDown();
//每次录音必须实例话对象 第二次不能成功录音
initializeAudio();
startRecord();
sound_recording.setVisibility(View.VISIBLE);
animationDrawable.start();
sound_delete_layout.setVisibility(View.VISIBLE);
}
松开手指后结束录音
private void handleStopRecord() {
if (recorder == null) {
return;
}
sound_mic.setImageResource(R.drawable.sound_mic1);
try {
recorder.stop();
recorder.release();
recorder = null;
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
//计算声音的长度
MediaPlayerManager.getInstance().prepare(mediaPlayer, filePath);
sound_recording.setVisibility(View.GONE);
//停止录制声音动画
animationDrawable.stop();
}
声音控制节点
所有的声音控制放在了MediaPlayerManager中,可以控制声音的暂停、重新播放、动画控制等
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.sound_show:
if (fileExists(false)) {
MediaPlayerManager.getInstance().restartPlaySound(this, mediaPlayerList, mediaPlayer, 0);
} else {
Toast.makeText(MainActivity.this, "请先录制声音", Toast.LENGTH_SHORT).show();
}
break;
case R.id.sound_delete:
//先暂定播放
MediaPlayerManager.getInstance().stopSound(mediaPlayer, 0);
deleteFile();
sound_delete_layout.setVisibility(View.INVISIBLE);
break;
default:
break;
}
}