辛苦堆砌,轉載請注明出處,謝謝!
下面開始使用MediaRecorder完成錄音功能,在使用MediaRecorder前,首先應當了解MediaRecorder的狀态圖,按圖索骥,沒有問題!下面給出MediaRecorder的狀态圖(實際上貼不貼無所謂了,網上一找一大把)。

從狀态圖看出幾點:
1.除了Release,其他狀态下,都可以調用reset回到Initial狀态;
2.Release是一個狀态孤島,進到Release狀态之後,整個狀态圖終結;
3.從Initial才可以到達Release,是以需要reset後,才能release;
4.注意從Initial到Prepared的過程,中間需要很多配置接口,記得設定,由于MediaRecorder既可以錄音也可以錄像,錄音和錄像需要設定的不同。
有了這幾點認知,就可以基于MediaRecorder封裝我們自己的AudioRecorder了,之是以封裝,是因為基于MediaRecorder還可以進行錄像,到時候我們可以做VideoRecorder,實際上我也是這麼打算的XD
package com.yjp.recorder;
import android.media.MediaRecorder;
import java.io.IOException;
public class AudioRecorder {
private MediaRecorder mRecorder;
public AudioRecorder() {
mRecorder = new MediaRecorder();
}
public void ReleaseAudioRecorder() {
resetAudioRecorder();
mRecorder.release();
mRecorder = null;
}
public void prepareAudioRecorder(String filePathname){
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mRecorder.setOutputFile(filePathname);
try {
mRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
resetAudioRecorder();
}
}
public void startAudioRecorder() {
try {
mRecorder.start();
} catch (IllegalStateException e) {
e.printStackTrace();
resetAudioRecorder();
}
}
public void stopAudioRecorder() {
try {
mRecorder.stop();
} catch (IllegalStateException e) {
e.printStackTrace();
resetAudioRecorder();
}
}
private void resetAudioRecorder() {
mRecorder.reset();
}
}
構造函數建立MediaRecorder,提供ReleaseAudioRecorder()釋放MediaRecorder,prepareAudioRecorder則是完成了從Initial到Prepared的,準備好了可用的MediaRecorder,其他函數都隻是MediaRecorder的簡單封裝,唯一加入的處理是,當狀态出錯時,直接重置為Initial狀态。
下面完成Activity部分,很簡單,利用一個按鈕啟動和關閉錄音
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:gravity="center"
tools:context="com.yjp.audiorecorder.MainActivity">
<Button
android:id="@+id/startAudioRecordingButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/startAudioRecording"/>
</RelativeLayout>
package com.yjp.audiorecorder;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import com.yjp.recorder.AudioRecorder;
import java.io.File;
import java.util.Date;
public class MainActivity extends AppCompatActivity {
private Button mStartAudioRecordingButton;
private AudioRecorder mAudioRecorder;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mStartAudioRecordingButton = (Button) findViewById(R.id.startAudioRecordingButton);
mStartAudioRecordingButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mStartAudioRecordingButton.getText().equals(
getResources().getString(R.string.startAudioRecording))) {
mStartAudioRecordingButton.setText(getResources().getString(R.string.stopAudioRecording));
String audioFileDir = Environment.getExternalStorageDirectory() + "/audio/";
File dir = new File(audioFileDir);
if (!dir.exists()) {
dir.mkdirs();
}
String audioFileName = new Date().getTime() + ".mp3";
mAudioRecorder.prepareAudioRecorder(audioFileDir + audioFileName);
mAudioRecorder.startAudioRecorder();
} else {
mStartAudioRecordingButton.setText(getResources().getString(R.string.startAudioRecording));
mAudioRecorder.stopAudioRecorder();
}
}
});
}
@Override
protected void onStart() {
super.onStart();
if (null == mAudioRecorder) {
mAudioRecorder = new AudioRecorder();
}
}
@Override
protected void onStop() {
if (null != mAudioRecorder) {
mAudioRecorder.ReleaseAudioRecorder();
mAudioRecorder = null;
}
mStartAudioRecordingButton.setText(getResources().getString(R.string.startAudioRecording));
super.onStop();
}
}
清單檔案添權重限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
完成,跑起來看看吧!
總結:學會使用MediaRecorder錄音和錄像,玩懂狀态圖就妥了,沒什麼難的。
源碼連結在這裡