实例介绍
【实例截图】

【核心代码】
package com.youmu.voicemanager;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import com.youmu.voicemanager.utils.CommonDefine;
import com.youmu.voicemanager.utils.FileUtils;
import com.youmu.voicemanager.utils.TimeMethod;
public class VoiceManager {
private ArrayList<File> mRecList = new ArrayList<File>();
private Activity mActivity = null;
private View mVRecRoot, mVPlaRoot, mVRecFinish;
private ImageView mIVRecOperate, mIVPlaOperate, mIVPlaStop;
private TextView mTVRecText, mTVRecTime, mTVPlaCurrent, mTVPlaTotal;
private SeekBar mSBPlayProgress;
private int mSavedState, mDeviceState = CommonDefine.MEDIA_STATE_UNDEFINE;
private MediaRecorder mMediaRecorder = null;
private MediaPlayer mMediaPlayer = null;
private String mRecTimePrev, mPlaFilePath;
private long mRecTimeSum = 0;
private String filePath = "";// 录音所存放的位置 "/com.youmu.voicemanager/audio"
private VoiceCallBack voiceCallBack;
private MediaPlayer.OnCompletionListener mPlayCompetedListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mDeviceState = CommonDefine.MEDIA_STATE_PLAY_STOP;
mHandler.removeMessages(CommonDefine.MSG_TIME_INTERVAL);
mMediaPlayer.stop();
mMediaPlayer.release();
mSBPlayProgress.setProgress(0);
mTVPlaCurrent.setText("00:00:00");
mIVPlaOperate.setImageResource(R.mipmap.voice_play);
}
};
@SuppressLint("HandlerLeak")
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
TimeMethod ts;
int current;
try {
switch (msg.what) {
case CommonDefine.MSG_TIME_INTERVAL:
if (mDeviceState == CommonDefine.MEDIA_STATE_RECORD_DOING) {
ts = TimeMethod.timeSpanToNow(mRecTimePrev);
mRecTimeSum = ts.mDiffSecond;
mRecTimePrev = TimeMethod.getTimeStrFromMillis(ts.mNowTime);
ts = TimeMethod.timeSpanSecond(mRecTimeSum);
mTVRecTime.setText(String.format("%02d:%02d:%02d",
ts.mSpanHour, ts.mSpanMinute, ts.mSpanSecond));
mHandler.sendEmptyMessageDelayed(CommonDefine.MSG_TIME_INTERVAL, 1000);
} else if (mDeviceState == CommonDefine.MEDIA_STATE_PLAY_DOING) {
current = mMediaPlayer.getCurrentPosition();
mSBPlayProgress.setProgress(current);
ts = TimeMethod.timeSpanSecond(current / 1000);
mTVPlaCurrent.setText(String.format("%02d:%02d:%02d",
ts.mSpanHour, ts.mSpanMinute, ts.mSpanSecond));
mHandler.sendEmptyMessageDelayed(CommonDefine.MSG_TIME_INTERVAL, 1000);
}
break;
default:
break;
}
} catch (Exception e) {
}
}
};
public void setVoiceListener (VoiceCallBack callBack) {
voiceCallBack = callBack;
}
public VoiceManager(Activity act, String filePath) {
this.mActivity = act;
this.filePath = filePath;
mVRecRoot = mActivity.findViewById(R.id.unit_voice_record_root);
mIVRecOperate = (ImageView) mActivity.findViewById(R.id.unit_voice_record_operate);
mTVRecText = (TextView) mActivity.findViewById(R.id.unit_voice_record_text);
mTVRecTime = (TextView) mActivity.findViewById(R.id.unit_voice_record_time);
mVRecFinish = mActivity.findViewById(R.id.unit_voice_record_finish);
mVPlaRoot = mActivity.findViewById(R.id.unit_voice_play_root);
mIVPlaOperate = (ImageView) mActivity.findViewById(R.id.unit_voice_play_operate);
mIVPlaStop = (ImageView) mActivity.findViewById(R.id.unit_voice_play_stop);
mSBPlayProgress = (SeekBar) mActivity.findViewById(R.id.unit_voice_play_progress);
mTVPlaCurrent = (TextView) mActivity.findViewById(R.id.unit_voice_play_current);
mTVPlaTotal = (TextView) mActivity.findViewById(R.id.unit_voice_play_total);
if (mIVRecOperate != null) {
mIVRecOperate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mDeviceState == CommonDefine.MEDIA_STATE_RECORD_DOING) {
mDeviceState = CommonDefine.MEDIA_STATE_RECORD_PAUSE;
stopRecorder(mMediaRecorder, true);
mMediaRecorder = null;
mTVRecText.setText("已暂停");
mIVRecOperate.setImageResource(R.mipmap.voice_pause);
} else {
sessionRecord(false);
}
}
});
}
if (mVRecFinish != null) {
mVRecFinish.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clickRecordFinish();
}
});
}
if (mIVPlaOperate != null) {
mIVPlaOperate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mDeviceState == CommonDefine.MEDIA_STATE_PLAY_DOING) {
mDeviceState = CommonDefine.MEDIA_STATE_PLAY_PAUSE;
pauseMedia(mMediaPlayer);
mIVPlaOperate.setImageResource(R.mipmap.voice_play);
} else if (mDeviceState == CommonDefine.MEDIA_STATE_PLAY_PAUSE) {
mDeviceState = CommonDefine.MEDIA_STATE_PLAY_DOING;
playMedia(mMediaPlayer);
mIVPlaOperate.setImageResource(R.mipmap.voice_pause);
mHandler.removeMessages(CommonDefine.MSG_TIME_INTERVAL);
mHandler.sendEmptyMessage(CommonDefine.MSG_TIME_INTERVAL);
} else if (mDeviceState == CommonDefine.MEDIA_STATE_PLAY_STOP) {
if (!TextUtils.isEmpty(mPlaFilePath)) {
sessionPlay(false, mPlaFilePath);
}
}
}
});
}
if (mIVPlaStop != null) {
mIVPlaStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
mHandler.removeMessages(CommonDefine.MSG_TIME_INTERVAL);
mDeviceState = CommonDefine.MEDIA_STATE_PLAY_STOP;
mIVPlaOperate.setImageResource(R.mipmap.voice_play);
mTVPlaCurrent.setText("00:00:00");
stopMedia(mMediaPlayer, true);
mMediaPlayer = null;
} catch (Exception e) {
} finally {
mVPlaRoot.setVisibility(View.GONE);
}
}
});
}
if (mSBPlayProgress != null) {
mSBPlayProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
mHandler.removeMessages(CommonDefine.MSG_TIME_INTERVAL);
mSavedState = mDeviceState;
if (mSavedState == CommonDefine.MEDIA_STATE_PLAY_DOING) {
pauseMedia(mMediaPlayer);
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mHandler.removeMessages(CommonDefine.MSG_TIME_INTERVAL);
TimeMethod ts = TimeMethod.timeSpanSecond(progress / 1000);
mTVPlaCurrent.setText(String.format("%02d:%02d:%02d",
ts.mSpanHour, ts.mSpanMinute, ts.mSpanSecond));
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
seektoMedia(mMediaPlayer, mSBPlayProgress.getProgress());
if (mSavedState == CommonDefine.MEDIA_STATE_PLAY_DOING) {
playMedia(mMediaPlayer);
mHandler.sendEmptyMessage(CommonDefine.MSG_TIME_INTERVAL);
}
}
});
}
}
public void sessionRecord(boolean init) {
if (!FileUtils.isSDCardAvailable()) return;
if (init) {
mRecTimeSum = 0;
cleanFieArrayList(mRecList);
}
stopRecorder(mMediaRecorder, true);
mMediaRecorder = null;
stopMedia(mMediaPlayer, true);
mMediaPlayer = null;
if (mVPlaRoot != null) {
mVPlaRoot.setVisibility(View.GONE);
}
mVRecRoot.setVisibility(View.VISIBLE);
mIVRecOperate.setImageResource(R.mipmap.voice_record);
mMediaRecorder = new MediaRecorder();
File file = prepareRecorder(mMediaRecorder, true);
if (file != null) {
mTVRecText.setText("正在录音");
mDeviceState = CommonDefine.MEDIA_STATE_RECORD_DOING;
mRecTimePrev = TimeMethod.getTimeStrFromMillis(System.currentTimeMillis());
mRecList.add(file);
mHandler.removeMessages(CommonDefine.MSG_TIME_INTERVAL);
mHandler.sendEmptyMessage(CommonDefine.MSG_TIME_INTERVAL);
}
}
public void sessionRecordEx(boolean init, int resTimeTextId) {
if (!FileUtils.isSDCardAvailable()) return;
if (init) {
mRecTimeSum = 0;
cleanFieArrayList(mRecList);
}
mTVRecTime = (TextView) mActivity.findViewById(resTimeTextId);
stopRecorder(mMediaRecorder, true);
mMediaRecorder = null;
stopMedia(mMediaPlayer, true);
mMediaPlayer = null;
if (mVPlaRoot != null) {
mVPlaRoot.setVisibility(View.GONE);
}
mMediaRecorder = new MediaRecorder();
File file = prepareRecorder(mMediaRecorder, true);
if (file != null) {
mDeviceState = CommonDefine.MEDIA_STATE_RECORD_DOING;
mRecTimePrev = TimeMethod.getTimeStrFromMillis(System.currentTimeMillis());
mRecList.add(file);
mHandler.removeMessages(CommonDefine.MSG_TIME_INTERVAL);
mHandler.sendEmptyMessage(CommonDefine.MSG_TIME_INTERVAL);
}
}
/**
* 完成录音
*/
public void clickRecordFinish() {
try {
mHandler.removeMessages(CommonDefine.MSG_TIME_INTERVAL);
mDeviceState = CommonDefine.MEDIA_STATE_RECORD_STOP;
stopRecorder(mMediaRecorder, true);
mMediaRecorder = null;
if (mVRecRoot != null) {
mVRecRoot.setVisibility(View.GONE);
}
if (TimeMethod.timeSpanSecond(mRecTimeSum).mSpanSecond == 0) {
Toast.makeText(mActivity, "时间过短", Toast.LENGTH_SHORT).show();
} else {
File file = getOutputVoiceFile(mRecList);
if (file != null && file.length() > 0) {
cleanFieArrayList(mRecList);
//TODO 这里可以返回数据 setResult
voiceCallBack.recFinish();
voiceCallBack.voicePath(file.getAbsolutePath());
}
}
} catch (Exception e) {
}
}
/**
* 录音播放
*
* @param init
* @param path
*/
public void sessionPlay(boolean init, String path) {
if (TextUtils.isEmpty(path)) return;
mPlaFilePath = path;
try {
mVPlaRoot.setVisibility(View.VISIBLE);
if (mVRecRoot != null) {
mVRecRoot.setVisibility(View.GONE);
}
mIVPlaOperate.setImageResource(R.mipmap.voice_pause);
mTVPlaCurrent.setText("00:00:00");
stopRecorder(mMediaRecorder, true);
mMediaRecorder = null;
stopMedia(mMediaPlayer, true);
mMediaPlayer = null;
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnCompletionListener(mPlayCompetedListener);
if (prepareMedia(mMediaPlayer, path)) {
mDeviceState = CommonDefine.MEDIA_STATE_PLAY_DOING;
TimeMethod ts = TimeMethod.timeSpanSecond(mMediaPlayer.getDuration() / 1000);
mTVPlaTotal.setText(String.format("%02d:%02d:%02d",
ts.mSpanHour, ts.mSpanMinute, ts.mSpanSecond));
mSBPlayProgress.setMax(Math.max(1, mMediaPlayer.getDuration()));
if (init) {
mSBPlayProgress.setProgress(0);
seektoMedia(mMediaPlayer, 0);
} else {
seektoMedia(mMediaPlayer, mSBPlayProgress.getProgress());
}
if (playMedia(mMediaPlayer)) {
mHandler.removeMessages(CommonDefine.MSG_TIME_INTERVAL);
mHandler.sendEmptyMessage(CommonDefine.MSG_TIME_INTERVAL);
}
}
} catch (Exception e) {
}
}
/**
* 合并录音
*
* @param list
* @return
*/
private File getOutputVoiceFile(ArrayList<File> list) {
String mMinute1 = TimeMethod.getTime();
String recFilePath = FileUtils.recAudioPath(filePath);
File recDirFile = FileUtils.recAudioDir(recFilePath);
// 创建音频文件,合并的文件放这里
File resFile = new File(recDirFile, mMinute1 ".amr");
FileOutputStream fileOutputStream = null;
if (!resFile.exists()) {
try {
resFile.createNewFile();
} catch (IOException e) {
}
}
try {
fileOutputStream = new FileOutputStream(resFile);
} catch (IOException e) {
}
// list里面为暂停录音 所产生的 几段录音文件的名字,中间几段文件的减去前面的6个字节头文件
for (int i = 0; i < list.size(); i ) {
File file = list.get(i);
try {
FileInputStream fileInputStream = new FileInputStream(file);
byte[] myByte = new byte[fileInputStream.available()];
// 文件长度
int length = myByte.length;
// 头文件
if (i == 0) {
while (fileInputStream.read(myByte) != -1) {
fileOutputStream.write(myByte, 0, length);
}
}
// 之后的文件,去掉头文件就可以了
else {
while (fileInputStream.read(myByte) != -1) {
fileOutputStream.write(myByte, 6, length - 6);
}
}
fileOutputStream.flush();
fileInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 结束后关闭流
try {
fileOutputStream.close();
} catch (IOException e) {
}
return resFile;
}
private void cleanFieArrayList(ArrayList<File> list) {
for (File file : list) {
file.delete();
}
list.clear();
}
/**
* 播放录音准备工作
*
* @param mp
* @param file
* @return
*/
private boolean prepareMedia(MediaPlayer mp, String file) {
boolean result = false;
try {
mp.setDataSource(file);
mp.prepare();
result = true;
} catch (Exception e) {
}
return result;
}
/**
* 播放录音开始
*
* @param mp
* @return
*/
private boolean playMedia(MediaPlayer mp) {
boolean result = false;
try {
if (mp != null) {
mp.start();
result = true;
}
} catch (Exception e) {
}
return result;
}
/**
* 拖动播放进度条
*
* @param mp
* @param pos
* @return
*/
private boolean seektoMedia(MediaPlayer mp, int pos) {
boolean result = false;
try {
if (mp != null && pos >= 0) {
mp.seekTo(pos);
result = true;
}
} catch (Exception e) {
}
return result;
}
/**
* 停止播放
*
* @param mp
* @param release
* @return
*/
private boolean stopMedia(MediaPlayer mp, boolean release) {
boolean result = false;
try {
if (mp != null) {
mp.stop();
if (release) {
mp.release();
}
result = true;
}
} catch (Exception e) {
}
return result;
}
/**
* 暂停播放
*
* @param mp
* @return
*/
private boolean pauseMedia(MediaPlayer mp) {
boolean result = false;
try {
if (mp != null) {
mp.pause();
result = true;
}
} catch (Exception e) {
}
return result;
}
/**
* 停止录音
*
* @param mr
* @param release
* @return
*/
private boolean stopRecorder(MediaRecorder mr, boolean release) {
boolean result = false;
try {
if (mr != null) {
mr.stop();
if (release) {
mr.release();
}
result = true;
}
} catch (Exception e) {
}
return result;
}
/**
* 录音准备工作 ,开始录音
*
* @param mr
* @param start
* @return
*/
@SuppressWarnings("deprecation")
private File prepareRecorder(MediaRecorder mr, boolean start) {
File recFile = null;
if (mr == null) return null;
try {
String path = FileUtils.recAudioPath(filePath);
recFile = new File(path, TimeMethod.getTime() ".amr");
mr.setAudioSource(MediaRecorder.AudioSource.MIC);
mr.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);
mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mr.setOutputFile(recFile.getAbsolutePath());
mr.prepare();
if (start) {
mr.start();
}
} catch (Exception e) {
}
return recFile;
}
}
标签: 录音与播放
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论