Android如何实现语音播放与录音功能
生活随笔
收集整理的這篇文章主要介紹了
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<mDatas.size()&&lastPosition!=position){
FendaListInfo.ObjsEntitybean=mDatas.get(lastPosition);
bean.isSelect=false;
mDatas.set(lastPosition,bean);
notifyDataSetChanged();
}
if(position<mDatas.size()&&position!=lastPosition){
FendaListInfo.ObjsEntitybean=mDatas.get(position);
bean.isSelect=true;
mDatas.set(position,bean);
}
}
/**
*適配器圖片播放的動畫處理
*/
privatevoidsetVoiceAnimation(ImageViewiv_voice,FendaListInfo.ObjsEntityobj){
//處理動畫復用問題
AnimationDrawableanimationDrawable;
if(obj.isSelect){
iv_voice.setBackgroundResource(R.drawable.animation_voice);
animationDrawable=(AnimationDrawable)iv_voice.getBackground();
if(MediaManager.isPlaying()&&animationDrawable!=null){
animationDrawable.start();
}else{
iv_voice.setBackgroundResource(R.drawable.voice_listen);
animationDrawable.stop();
}
}else{
iv_voice.setBackgroundResource(R.drawable.voice_listen);
}
}
總結
以上是生活随笔為你收集整理的Android如何实现语音播放与录音功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx怎么用htpasswd对网站进
- 下一篇: MQ保证消息的可靠性传输