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 android:id="@+id/chronometer" />
// 代碼
chronometer.setBase(SystemClock.elapsedRealtime());
chronometer.start(); // 自動每秒更新格式
chronometer.stop();
Chronometer 內建格式化、暫停續傳,極簡易用,推薦優先考慮。