Android实现语音播放与录音功能
本文实例为大家分享了Android实现语音播放与录音的具体代码,供大家参考,具体内容如下
项目用到的技术点和亮点
- 语音录音(单个和列表)
- 语音播放(单个和列表)
- 语音录音封装
- 语音播放器封装
- 语音列表顺序播放
- 语音列表单个播放复用问题处理
 
因为安装原生录音不能录mp3格式文件而mp3格式是安卓和ios公用的,所以我们需要的是能直接录取mp3文件或者录完的格式转成mp3格式
下面添加这个库能直接录mp3文件,我觉得是最方便的
compile‘com.czt.mp3recorder:library:1.0.3'
1.语音录音封装
代码简单自己看吧
packagecom.video.zlc.audioplayer;
importcom.czt.mp3recorder.MP3Recorder;
importcom.video.zlc.audioplayer.utils.LogUtil;
importjava.io.File;
importjava.io.IOException;
importjava.util.UUID;
/**
*@authorzlc
*/
publicclassAudioManage{
privateMP3RecordermRecorder;
privateStringmDir;//文件夹的名称
privateStringmCurrentFilePath;
privatestaticAudioManagemInstance;
privatebooleanisPrepared;//标识MediaRecorder准备完毕
privateAudioManage(Stringdir){
mDir=dir;
LogUtil.e("AudioManage=",mDir);
}
/**
*回调“准备完毕”
*@authorzlc
*/
publicinterfaceAudioStateListenter{
voidwellPrepared();//prepared完毕
}
publicAudioStateListentermListenter;
publicvoidsetOnAudioStateListenter(AudioStateListenteraudioStateListenter){
mListenter=audioStateListenter;
}
/**
*使用单例实现AudioManage
*@paramdir
*@return
*/
publicstaticAudioManagegetInstance(Stringdir){
if(mInstance==null){
synchronized(AudioManage.class){//同步
if(mInstance==null){
mInstance=newAudioManage(dir);
}
}
}
returnmInstance;
}
/**
*准备录音
*/
publicvoidprepareAudio(){
try{
isPrepared=false;
Filedir=newFile(mDir);
if(!dir.exists()){
dir.mkdirs();
}
StringfileName=GenerateFileName();//文件名字
Filefile=newFile(dir,fileName);//路径+文件名字
//MediaRecorder可以实现录音和录像。需要严格遵守API说明中的函数调用先后顺序.
mRecorder=newMP3Recorder(file);
mCurrentFilePath=file.getAbsolutePath();
//mMediaRecorder=newMediaRecorder();
//mCurrentFilePath=file.getAbsolutePath();
//mMediaRecorder.setOutputFile(file.getAbsolutePath());//设置输出文件
//mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置MediaRecorder的音频源为麦克风
//mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);//设置音频的格式
//mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频的编码为AMR_NB
//mMediaRecorder.prepare();
//mMediaRecorder.start();
mRecorder.start();//开始录音
isPrepared=true;//准备结束
if(mListenter!=null){
mListenter.wellPrepared();
}
}catch(Exceptione){
e.printStackTrace();
LogUtil.e("prepareAudio",e.getMessage());
}
}
/**
*随机生成文件名称
*@return
*/
privateStringGenerateFileName(){
//TODOAuto-generatedmethodstub
returnUUID.randomUUID().toString()+".mp3";//音频文件格式
}
/**
*获得音量等级——通过mMediaRecorder获得振幅,然后换算成声音Level
*maxLevel最大为7;
*@return
*/
publicintgetVoiceLevel(intmaxLevel){
if(isPrepared){
try{
mRecorder.getMaxVolume();
returnmaxLevel*mRecorder.getMaxVolume()/32768+1;
}catch(Exceptione){
e.printStackTrace();
}
}
return1;
}
/**
*释放资源
*/
publicvoidrelease(){
if(mRecorder!=null){
mRecorder.stop();
mRecorder=null;
}
}
/**
*停止录音
*/
publicvoidstop(){
if(mRecorder!=null&&mRecorder.isRecording()){
mRecorder.stop();
}
}
/**
*取消(释放资源+删除文件)
*/
publicvoiddelete(){
release();
if(mCurrentFilePath!=null){
Filefile=newFile(mCurrentFilePath);
file.delete();//删除录音文件
mCurrentFilePath=null;
}
}
publicStringgetCurrentFilePath(){
returnmCurrentFilePath;
}
publicintgetMaxVolume(){
returnmRecorder.getMaxVolume();
}
publicintgetVolume(){
returnmRecorder.getVolume();
}
}
2.语音播放器封装
packagecom.video.zlc.audioplayer.utils;
importandroid.content.Context;
importandroid.media.AudioManager;
importandroid.media.MediaPlayer;
importandroid.net.Uri;
/**
*
*@authorzlc
*
*/
publicclassMediaManager{
privatestaticMediaPlayermMediaPlayer;//播放录音文件
privatestaticbooleanisPause=false;
static{
if(mMediaPlayer==null){
mMediaPlayer=newMediaPlayer();
mMediaPlayer.setOnErrorListener(newMediaPlayer.OnErrorListener(){
@Override
publicbooleanonError(MediaPlayermp,intwhat,intextra){
mMediaPlayer.reset();
returnfalse;
}
});
}
}
/**
*播放音频
*@paramfilePath
*@paramonCompletionListenter
*/
publicstaticvoidplaySound(Contextcontext,StringfilePath,MediaPlayer.OnCompletionListeneronCompletionListenter){
if(mMediaPlayer==null){
mMediaPlayer=newMediaPlayer();
mMediaPlayer.setOnErrorListener(newMediaPlayer.OnErrorListener(){
@Override
publicbooleanonError(MediaPlayermp,intwhat,intextra){
mMediaPlayer.reset();
returnfalse;
}
});
}else{
mMediaPlayer.reset();
}
try{
//详见“MediaPlayer”调用过程图
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setOnCompletionListener(onCompletionListenter);
mMediaPlayer.setDataSource(filePath);
mMediaPlayer.prepare();
mMediaPlayer.start();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
LogUtil.e("语音error==",e.getMessage());
}
}
/**
*暂停
*/
publicsynchronizedstaticvoidpause(){
if(mMediaPlayer!=null&&mMediaPlayer.isPlaying()){
mMediaPlayer.pause();
isPause=true;
}
}
//停止
publicsynchronizedstaticvoidstop(){
if(mMediaPlayer!=null&&mMediaPlayer.isPlaying()){
mMediaPlayer.stop();
isPause=false;
}
}
/**
*resume继续
*/
publicsynchronizedstaticvoidresume(){
if(mMediaPlayer!=null&&isPause){
mMediaPlayer.start();
isPause=false;
}
}
publicstaticbooleanisPause(){
returnisPause;
}
publicstaticvoidsetPause(booleanisPause){
MediaManager.isPause=isPause;
}
/**
*release释放资源
*/
publicstaticvoidrelease(){
if(mMediaPlayer!=null){
isPause=false;
mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer=null;
}
}
publicsynchronizedstaticvoidreset(){
if(mMediaPlayer!=null){
mMediaPlayer.reset();
isPause=false;
}
}
/**
*判断是否在播放视频
*@return
*/
publicsynchronizedstaticbooleanisPlaying(){
returnmMediaPlayer!=null&&mMediaPlayer.isPlaying();
}
}
3.语音列表顺序播放
privateintlastPos=-1;
//播放语音
privatevoidplayVoice(finalintposition,Stringfrom){
LogUtil.e("playVoiceposition",position+"");
if(position>=records.size()){
LogUtil.e("playVoice","全部播放完了");
stopAnimation();
MediaManager.reset();
return;
}
StringvoicePath=records.get(position).getPath();
LogUtil.e("playVoice",voicePath);
if(TextUtils.isEmpty(voicePath)||!voicePath.contains(".mp3")){
Toast.makeText(this,"语音文件不合法",Toast.LENGTH_LONG).show();
return;
}
if(lastPos!=position&&"itemClick".equals(from)){
stopAnimation();
MediaManager.reset();
}
lastPos=position;
//获取listview某一个条目的图片控件
intpos=position-id_list_voice.getFirstVisiblePosition();
Viewview=id_list_voice.getChildAt(pos);
id_iv_voice=(ImageView)view.findViewById(R.id.id_iv_voice);
LogUtil.e("playVoiceposition",pos+"");
if(MediaManager.isPlaying()){
MediaManager.pause();
stopAnimation();
}elseif(MediaManager.isPause()){
startAnimation();
MediaManager.resume();
}else{
startAnimation();
MediaManager.playSound(this,voicePath,newMediaPlayer.OnCompletionListener(){
@Override
publicvoidonCompletion(MediaPlayermediaPlayer){
//播放完停止动画重置MediaManager
stopAnimation();
MediaManager.reset();
playVoice(position+1,"loop");
}
});
}
}
4.语音列表单个播放复用问题处理
播放逻辑基本同上
privateintlastPosition=-1;
privatevoidplayVoice(FendaListInfo.ObjsEntityobj,intposition){
StringvideoPath=obj.path;
if(TextUtils.isEmpty(videoPath)||!videoPath.contains(".mp3")){
Toast.makeText(this,"语音文件不合法",Toast.LENGTH_LONG).show();
return;
}
if(position!=lastPosition){//点击不同条目先停止动画重置音频资源
stopAnimation();
MediaManager.reset();
}
if(mAdapter!=null)
mAdapter.selectItem(position,lastPosition);
lastPosition=position;
id_iv_voice.setBackgroundResource(R.drawable.animation_voice);
animationDrawable=(AnimationDrawable)id_iv_voice.getBackground();
if(MediaManager.isPlaying()){
stopAnimation();
MediaManager.pause();
}elseif(MediaManager.isPause()){
startAnimation();
MediaManager.resume();
}else{
startAnimation();
MediaManager.playSound(this,videoPath,newMediaPlayer.OnCompletionListener(){
@Override
publicvoidonCompletion(MediaPlayermp){
LogUtil.e("onCompletion","播放完成");
stopAnimation();
MediaManager.stop();
}
});
}
}
//核心方法
//点击了某一个条目这个条目isSelect=true上一个条目isSelect需要改为false防止滑动过程中帧动画复用问题
publicvoidselectItem(intposition,intlastPosition){
LogUtil.e("selectItem",";lastPosition="+lastPosition+";position="+position);
if(lastPosition>=0&&lastPosition
5.下载地址
Android实现语音播放与录音
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
 