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&&lastPosition5.下载地址
Android实现语音播放与录音
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。