您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Android怎么實現錄音功能,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
效果圖如下所示:
使用方法:
錄音工具類: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(); //有一些網友反應在5.0以上在調用stop的時候會報錯,翻閱了一下谷歌文檔發現上面確實寫的有可能會報錯的情況,捕獲異常清理一下就行了,感謝大家反饋! 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; } /** * 更新麥克狀態 */ 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()和錄音監聽setOnAudioStatusUpdateListener(),注意,取消錄音不保存文件,結束錄音會保存文件!
在布局文件中添加一個控件(任意一個都行)
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="按住說話" android:textColor="@android:color/white" android:id="@+id/button" android:background="@color/colorPrimary" />
在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) { //根據分貝值來設置錄音時話筒圖標的上下波動,下面有講解 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監聽 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怎么實現錄音功能”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。