1. 程式人生 > >Android—錄音開發MediaRecorder的檔案錯誤和MediaRecorder.stop()報-19

Android—錄音開發MediaRecorder的檔案錯誤和MediaRecorder.stop()報-19

在新的專案需求中要求做一個類似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;
    }

暫時就這些,若還有可補充的會另寫一個較詳細的記錄