這篇文章將為大家詳細講解有關Android怎么實現(xiàn)錄音功能,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都全網(wǎng)營銷推廣、網(wǎng)站重做改版、江西網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5技術、購物商城網(wǎng)站建設、集團公司官網(wǎng)建設、外貿營銷網(wǎng)站建設、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為江西等各大城市提供網(wǎng)站開發(fā)制作服務。
效果圖如下所示:
使用方法:
錄音工具類:AudioRecoderUtils.java,代碼如下:
public class AudioRecoderUtils { //文件路徑 private String filePath; //文件夾路徑 private String FolderPath; private MediaRecorder mMediaRecorder; private final String TAG = "fan"; public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大錄音時長1000*60*10; private OnAudioStatusUpdateListener audioStatusUpdateListener; /** * 文件存儲默認sdcard/record */ public AudioRecoderUtils(){ //默認保存路徑為/sdcard/record/下 this(Environment.getExternalStorageDirectory()+"/record/"); } public AudioRecoderUtils(String filePath) { File path = new File(filePath); if(!path.exists()) path.mkdirs(); this.FolderPath = filePath; } private long startTime; private long endTime; /** * 開始錄音 使用amr格式 * 錄音文件 * @return */ public void startRecord() { // 開始錄音 /* ①Initial:實例化MediaRecorder對象 */ if (mMediaRecorder == null) mMediaRecorder = new MediaRecorder(); try { /* ②setAudioSource/setVedioSource */ mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 設置麥克風 /* ②設置音頻文件的編碼:AAC/AMR_NB/AMR_MB/Default 聲音的(波形)的采樣 */ mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); /* * ②設置輸出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式 * ,H263視頻/ARM音頻編碼)、MPEG-4、RAW_AMR(只支持音頻且音頻編碼要求為AMR_NB) */ mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); filePath = FolderPath + TimeUtils.getCurrentTime() + ".amr" ; /* ③準備 */ mMediaRecorder.setOutputFile(filePath); mMediaRecorder.setMaxDuration(MAX_LENGTH); mMediaRecorder.prepare(); /* ④開始 */ mMediaRecorder.start(); // AudioRecord audioRecord. /* 獲取開始時間* */ startTime = System.currentTimeMillis(); updateMicStatus(); Log.e("fan", "startTime" + startTime); } catch (IllegalStateException e) { Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage()); } catch (IOException e) { Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage()); } } /** * 停止錄音 */ public long stopRecord() { if (mMediaRecorder == null) return 0L; endTime = System.currentTimeMillis(); //有一些網(wǎng)友反應在5.0以上在調用stop的時候會報錯,翻閱了一下谷歌文檔發(fā)現(xiàn)上面確實寫的有可能會報錯的情況,捕獲異常清理一下就行了,感謝大家反饋! try { mMediaRecorder.stop(); mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; audioStatusUpdateListener.onStop(filePath); filePath = ""; }catch (RuntimeException e){ mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; File file = new File(filePath); if (file.exists()) file.delete(); filePath = ""; } return endTime - startTime; } /** * 取消錄音 */ public void cancelRecord(){ try { mMediaRecorder.stop(); mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; }catch (RuntimeException e){ mMediaRecorder.reset(); mMediaRecorder.release(); mMediaRecorder = null; } File file = new File(filePath); if (file.exists()) file.delete(); filePath = ""; } private final Handler mHandler = new Handler(); private Runnable mUpdateMicStatusTimer = new Runnable() { public void run() { updateMicStatus(); } }; private int BASE = 1; private int SPACE = 100;// 間隔取樣時間 public void setOnAudioStatusUpdateListener(OnAudioStatusUpdateListener audioStatusUpdateListener) { this.audioStatusUpdateListener = audioStatusUpdateListener; } /** * 更新麥克狀態(tài) */ private void updateMicStatus() { if (mMediaRecorder != null) { double ratio = (double)mMediaRecorder.getMaxAmplitude() / BASE; double db = 0;// 分貝 if (ratio > 1) { db = 20 * Math.log10(ratio); if(null != audioStatusUpdateListener) { audioStatusUpdateListener.onUpdate(db,System.currentTimeMillis()-startTime); } } mHandler.postDelayed(mUpdateMicStatusTimer, SPACE); } } public interface OnAudioStatusUpdateListener { /** * 錄音中... * @param db 當前聲音分貝 * @param time 錄音時長 */ public void onUpdate(double db,long time); /** * 停止錄音 * @param filePath 保存路徑 */ public void onStop(String filePath); } }
使用很簡單,主要就是開始錄音startRecord()、取消錄音cancelRecord()、結束錄音stopRecord()和錄音監(jiān)聽setOnAudioStatusUpdateListener(),注意,取消錄音不保存文件,結束錄音會保存文件!
在布局文件中添加一個控件(任意一個都行)
在Activity中使用:
//當前布局文件的根layout final RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl); mButton = (Button) findViewById(R.id.button); //PopupWindow的布局文件 final View view = View.inflate(this, R.layout.layout_microphone, null); final PopupWindowFactory mPop = new PopupWindowFactory(this,view); //PopupWindow布局文件里面的控件 mImageView = (ImageView) view.findViewById(R.id.iv_recording_icon); mTextView = (TextView) view.findViewById(R.id.tv_recording_time); mAudioRecoderUtils = new AudioRecoderUtils(); //錄音回調 mAudioRecoderUtils.setOnAudioStatusUpdateListener(new AudioRecoderUtils.OnAudioStatusUpdateListener() { //錄音中....db為聲音分貝,time為錄音時長 @Override public void onUpdate(double db, long time) { //根據(jù)分貝值來設置錄音時話筒圖標的上下波動,下面有講解 mImageView.getDrawable().setLevel((int) (3000 + 6000 * db / 100)); mTextView.setText(TimeUtils.long2String(time)); } //錄音結束,filePath為保存路徑 @Override public void onStop(String filePath) { Toast.makeText(MainActivity.this, "錄音保存在:" + filePath, Toast.LENGTH_SHORT).show(); mTextView.setText(TimeUtils.long2String(0)); } }); //Button的touch監(jiān)聽 mButton.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: mPop.showAtLocation(rl,Gravity.CENTER,0,0); mButton.setText("松開保存"); mAudioRecoderUtils.startRecord(); break; case MotionEvent.ACTION_UP: mAudioRecoderUtils.stopRecord(); //結束錄音(保存錄音文件) // mAudioRecoderUtils.cancelRecord(); //取消錄音(不保存錄音文件) mPop.dismiss(); mButton.setText("按住說話"); break; } return true; } });
關于“Android怎么實現(xiàn)錄音功能”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。