Android—錄音開發MediaRecorder的檔案錯誤和MediaRecorder.stop()報-19
阿新 • • 發佈:2018-12-17
在新的專案需求中要求做一個類似QQ按住說話語音功能,第一時間想到的是用service搭配MediaRecorder實現錄音功能,聽著歌快樂的搞定了(基本上OK了),小組開發的說幫忙處理下,於是回過頭來看時裡面的格式什麼的都上升了幾個檔次,瞬間被羞愧了。然後就給我說錄音還是有問題:
1. 當前錄音的傳送得到的錄音地址是上一次的錄音,原因是採用SharedPreferences存放當前錄音檔案路徑和檔案URL是在MediaRecorder的stop()方法之後,主執行緒中拿去這個SharedPreferences存放的值是在錄音處理的services的topService(Activity)之後去處理的,這造成了主執行緒這邊關閉這個service後拿錄音檔案地址是在真實的service的Destory()方法之前的,以至於真實的當前錄音此時還未存放,當然就會bug了,所以在考慮使用SharedPreferences情況下就在Service的topService(Activity)和Destory()方法中MediaRecorder的stop()方法後存當前錄音檔案後呼叫一次EventBus,最後在拿去資料的時候呼叫一次該方法,保證拿到當前的檔案;
2. 由於是長按觸發錄音,鬆開觸發傳送事件,所以一不注意就很容易造成MediaRecorder的stop()方法造成-19錯誤。這是因為控制元件點選時間過短對MediaRecorder的監聽和物件為空造成的,已證明測試可行的方法是對MediaRecorder.stop()丟擲異常,即為:
MediaRecorder mRecorder = new MediaRecorder(); //在啟用錄音時一定要宣告MediaRecorder 的物件 mRecorder.setOnErrorListener(null); mRecorder.setOnInfoListener(null); mRecorder.setPreviewDisplay(null); try { mRecorder.stop(); //這是對錄音檔案的時長和檔案儲存處理,可忽視 mElapsedMillis = (System.currentTimeMillis() - mStartingTimeMillis); mRecorder.release(); getSharedPreferences("sp_name_audio", MODE_PRIVATE) .edit() .putString("audio_path", mFilePath) .putLong("elpased", mElapsedMillis) .apply(); if (mIncrementTimerTask != null) { mIncrementTimerTask.cancel(); mIncrementTimerTask = null; } mRecorder = null; } catch (IllegalStateException e) { ToastUtil.showShort(mActivity,"按鍵時間太短!"); e.printStackTrace(); }catch (RuntimeException e) { ToastUtil.showShort(mActivity,"按鍵時間太短!"); e.printStackTrace(); } catch (Exception e) { ToastUtil.showShort(mActivity,"按鍵時間太短!"); e.printStackTrace(); } mRecorder.release(); mRecorder = null; }
暫時就這些,若還有可補充的會另寫一個較詳細的記錄