天天看點

Android多媒體應用開發系列(三) 使用MediaRecorder錄音

辛苦堆砌,轉載請注明出處,謝謝!

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

Android多媒體應用開發系列(三) 使用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錄音和錄像,玩懂狀态圖就妥了,沒什麼難的。

源碼連結在這裡

Android多媒體應用開發系列(三) 使用MediaRecorder錄音