日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Android如何实现语音播放与录音功能

發(fā)布時間:2023/12/15 综合教程 36 生活家
生活随笔 收集整理的這篇文章主要介紹了 Android如何实现语音播放与录音功能 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這篇文章主要介紹Android如何實現(xiàn)語音播放與錄音功能,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

具體內容如下

項目用到的技術點和亮點

  • 語音錄音 (單個和列表)

  • 語音播放(單個和列表)

  • 語音錄音封裝

  • 語音播放器封裝

  • 語音列表順序播放

  • 語音列表單個播放 復用問題處理

因為安裝原生錄音不能錄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;
}

/**
*使用單例實現(xiàn)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可以實現(xiàn)錄音和錄像。需要嚴格遵守API說明中的函數(shù)調用先后順序.
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繼續(xù)
*/
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如何实现语音播放与录音功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产啊v在线 | 手机看片久久久 | 久久久久久久久久99精品 | av五月| 国产一区二区三区日韩 | 色视频在线观看免费 | 亚洲久久在线观看 | 午夜久久久精品 | 96精品| 国产午夜无码视频在线观看 | 国产不卡一区二区视频 | 国产91清纯白嫩初高中在线观看 | 欧美国产在线看 | 中文无码熟妇人妻av在线 | a毛片成人| 先锋资源一区 | 粉嫩在线 | 秋霞啪啪片 | 中文字幕人妻熟女人妻a片 麻豆91视频 | 不卡免费视频 | 久久91精品 | 最新理伦片eeuss影院 | 涩涩一区| 久久精品国产露脸对白 | 热热色原网址 | 欧美日韩一区二区三区国产精品成人 | 91.久久| 不卡免费视频 | 老司机免费精品视频 | 一区二区三区四区亚洲 | 国精品一区二区 | 国产suv一区二区 | 波多野结衣在线观看一区二区三区 | 久青草国产在线 | 91影院在线观看 | 色天堂在线视频 | 久久久久噜噜噜亚洲熟女综合 | 亚洲av永久无码精品 | 麻豆视频一区二区三区 | 欧美日韩亚洲系列 | 91久久精品一区二区三区 | 无限资源日本好片 | 激情视频91| 亚洲再线 | 欧美人与禽zozzo禽性配 | 色久阁| 四虎视频国产精品免费入口 | 日韩视频在线一区 | 一级片免费观看 | 一级二级三级黄色片 | 国产精品免费视频一区二区三区 | 久久久婷婷 | 日本最新中文字幕 | 日本肉体xxxx裸体137大胆图 | 亚洲性激情 | 波多av在线| 亚洲一区亚洲二区 | 欧美激情国产一区 | 成人涩涩视频 | jizz中国女人| 国内精品人妻无码久久久影院蜜桃 | 中文字幕在线观看第一页 | 黄网www| 夜夜爽日日澡人人添 | 国产精品正在播放 | 日本一区二区三区视频在线观看 | 欧美中文字幕在线 | 18女人毛片| 免费av国产 | 精品一区二区三区无码视频 | 日本一区二区不卡在线 | 日韩av地址 | 国产经典三级在线 | 秋霞福利| 在线中出 | 日韩视频免费观看高清完整版 | 高清性爱视频 | 男人久久天堂 | 国产毛片自拍 | 国产精选一区 | 91精品人妻一区二区三区果冻 | 人人99 | 精品福利视频一区二区 | h官场少妇第三部分 | 在线不卡欧美 | av永久在线 | 人妻无码中文字幕免费视频蜜桃 | 亚洲精品国产视频 | 亚洲精品无码专区 | 久久精品国产电影 | 国产精品永久在线 | 在线不卡 | 在线观看视频你懂得 | 嫩模被强到高潮呻吟不断 | 日韩成人动漫在线观看 | 久久人人爽人人人人片 | 欧美日韩精品一区二区三区 | 青青草手机视频在线观看 | 粉嫩一区 |