首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android MediaRecorder 錄音計時器實作:Handler + Runnable 週期更新 UI

     編輯:程式設計綜合問答

核心邏輯

MediaRecorder 本身無內建計時功能,需自行記錄開始時間並定期更新 UI。標準做法:System.currentTimeMillis() 記錄起始點,配合 Handler.postDelayed 每秒刷新顯示。

完整實作範例

private long startTime = 0;
private Handler timerHandler = new Handler(Looper.getMainLooper());
private Runnable timerRunnable = new Runnable() {
    @Override
    public void run() {
        long elapsed = (System.currentTimeMillis() - startTime) / 1000; // 秒
        int min = (int) (elapsed / 60);
        int sec = (int) (elapsed % 60);
        tvTimer.setText(String.format("%02d:%02d", min, sec));
        timerHandler.postDelayed(this, 1000);
    }
};

// 開始錄音
private void startRecording() {
    // ... MediaRecorder 設定與 start() ...
    startTime = System.currentTimeMillis();
    timerHandler.post(timerRunnable);
}

// 停止錄音
private void stopRecording() {
    timerHandler.removeCallbacks(timerRunnable);
    // ... MediaRecorder stop/reset/release ...
}

關鍵細節

  • 使用 Looper.getMainLooper() 確保 Handler 綁定主執行緒,安全更新 UI。
  • removeCallbacks 必須在停止時呼叫,避免記憶體洩漏與多重計時。
  • 若需毫秒精度,改用 SystemClock.elapsedRealtime() 避免系統時間變更影響。
  • 錄音暫停/繼續邏輯需自行累加暫停時長,或改用 Chronometer 內建支援。

替代方案:Chronometer

<Chronometer android:id="@+id/chronometer" />
// 代碼
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.start(); // 自動每秒更新格式
chronometer.stop();

Chronometer 內建格式化、暫停續傳,極簡易用,推薦優先考慮。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved