Android媒体录制,Android之媒体录制MediaRecorder及音频录制(转)

通常使用MediaRecorder进行声音录制需要遵从以下几个步骤:

实例化MediaRecorder类对象:

MediaRecorder iMediaRecorder= new

MediaRecorder();

设置录音来源 :

iMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

设置输出格式:

iMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);

设置编码方式

iMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

设置输出文件

iMediaRecorder.setOutputFile(PATH_NAME);

让MediaRecorder对象处于就绪状态

iMediaRecorder.prepare();

开始录音

iMediaRecorder.start();

停止录音,一旦停止则必须从新配置MediaRecorder对象才能再次开始录音。

iMediaRecorder.stop();

从新启动MediaRecorder对象让它处于空闲状态。

iMediaRecorder.reset();

释放和MediaRecorder对向相关的所有资源。

iMediaRecorder.release();

程序实现:

public class ActivityMain extends Activity {

private

ImageButton iRecordButton;

private

ImageButton iStopButton;

private

ImageButton iPlayButton;

private

ImageButton iDeleteButton;

private

ListView iListView;

private

String iTempFileNameString = "iRecorder_";

private

File iRecAudioFile;

private

File iRecAudioDir;

private

File iPlayFile;

private

MediaRecorder iMediaRecorder;

private

ArrayList iRecordFiles;

private

ArrayAdapter iAdapter;

private

TextView iTextView;

private

boolean isSDCardExit;

private

boolean isStopRecord;

@Override

public

void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

iRecordButton = (ImageButton)

findViewById(R.id.ImageButton01);

iStopButton = (ImageButton)

findViewById(R.id.ImageButton02);

iPlayButton = (ImageButton)

findViewById(R.id.ImageButton03);

iDeleteButton = (ImageButton)

findViewById(R.id.ImageButton04);

iListView = (ListView)

findViewById(R.id.ListView01);

iTextView = (TextView)

findViewById(R.id.TextView01);

iStopButton.setEnabled(false);

iPlayButton.setEnabled(false);

iDeleteButton.setEnabled(false);

需要判断SD卡是否是插入状态,以保证我们可以长时间的进行录音。如果存在则取得SD卡路径作为录音的文件位置。然后取得SD卡中的.amr文件。getRecordFiles()是一个自定义的方法,后面将会有说明。

isSDCardExit =

Environment.getExternalStorageState().equals(

android.os.Environment.MEDIA_MOUNTED);

if (isSDCardExit)

iRecAudioDir =

Environment.getExternalStorageDirectory();

this.getRecordFiles();

iAdapter =

new ArrayAdapter(this, R.layout.my_simple_list_item,

iRecordFiles);

iListView.setAdapter(iAdapter);

对第一个录音按钮我们最需要注意的是在iMediaRecorder.start()之前我们必须调用iMediaRecorder.prepare()来捕获和编码数据,而且prepare()必须要在设置音频源、编码器、以及文件格式之后才能调用!

iRecordButton.setOnClickListener(new ImageButton.OnClickListener()

{

@Override

public void onClick(View

arg0) {

try {

if

(!isSDCardExit) {

Toast.makeText(ActivityMain.this, "请插入SD Card",

Toast.LENGTH_LONG).show();

return;

}

iRecAudioFile = File.createTempFile(iTempFileNameString,

".amr", iRecAudioDir);

iMediaRecorder = new MediaRecorder();

iMediaRecorder

.setAudioSource(MediaRecorder.AudioSource.MIC);

iMediaRecorder

.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);

iMediaRecorder

.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

iMediaRecorder.setOutputFile(iRecAudioFile

.getAbsolutePath());

iMediaRecorder.prepare();

iMediaRecorder.start();

iTextView.setText("正在录音");

iStopButton.setEnabled(true);

iPlayButton.setEnabled(false);

iDeleteButton.setEnabled(false);

isStopRecord = false;

} catch (IOException e) {

// TODO

Auto-generated catch block

e.printStackTrace();

}

}

});

在停止录音的时候需要iMediaRecorder.stop()停止录音,一旦停止录音,必须从新配置MediaRecorder才可以。iMediaRecorder.release()用来释放和iMediaRecorder对象相关的所有资源。最后把iMediaRecorder赋值为null。

iStopButton.setOnClickListener(new ImageButton.OnClickListener() {

@Override

public

void onClick(View arg0) {

// TODO Auto-generated method

stub

if (iRecAudioFile != null) {

iMediaRecorder.stop();

iMediaRecorder.release();

iMediaRecorder = null;

iAdapter.add(iRecAudioFile.getName());

iTextView.setText("停止:" +

iRecAudioFile.getName());

iStopButton.setEnabled(false);

isStopRecord = true;

}

}

});

iPlayButton.setOnClickListener(new

ImageButton.OnClickListener() {

@Override

public

void onClick(View arg0) {

// TODO Auto-generated method

stub

if (iPlayFile != null

&& iPlayFile.exists()) {

openFile(iPlayFile);

}

}

});

iDeleteButton.setOnClickListener(new

ImageButton.OnClickListener() {

@Override

public

void onClick(View arg0) {

// TODO Auto-generated method

stub

if (iPlayFile != null) {

iAdapter.remove(iPlayFile.getName());

if (iPlayFile.exists())

iPlayFile.delete();

iTextView.setText("删除完成");

}

}

});

iListView.setOnItemClickListener(new

AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView< ?>

arg0, View arg1, int arg2,

long arg3) {

iPlayButton.setEnabled(true);

iDeleteButton.setEnabled(true);

iPlayFile

= new File(iRecAudioDir.getAbsolutePath()

+ File.separator + ((CheckedTextView)

arg1).getText());

iTextView.setText("您选择的是:" + ((CheckedTextView) arg1).getText());

}

});

在Activity的onStop()方法也要加进去释放iMediaRecorder的语句。

@Override

protected void onStop() {

if

(iMediaRecorder != null && !isStopRecord) {

iMediaRecorder.stop();

iMediaRecorder.release();

iMediaRecorder = null;

}

super.onStop();

}

这是一个自定义方法,目的是从手机存储卡中取出以.amr结尾的文件。

private void getRecordFiles() {

iRecordFiles = new ArrayList();

if

(isSDCardExit) {

File files[] =

iRecAudioDir.listFiles();

if (files != null) {

for (int i = 0; i < files.length; i++) {

if

(files[i].getName().indexOf(".") >= 0) {

String fileS =

files[i].getName().substring(

files[i].getName().indexOf("."));

if

(fileS.toLowerCase().equals(".amr"))

iRecordFiles.add(files[i].getName());

}

}

}

}

}

调用系统自带播放器来播放刚才录制好的声音片段。Android系统会根据文件类型来自动决定使用何种工具来打开对应的文件。当然我们还可以用

Android 提供的MediaPlayer类来实现声音片段的播放,由于篇幅有限,这里不再介绍。

private void

openFile(File aFile) {

Intent intent = new Intent();

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

intent.setAction(android.content.Intent.ACTION_VIEW);

String type = getMIMEType(aFile);

intent.setDataAndType(Uri.fromFile(aFile),

type);

startActivity(intent);

}

private String

getMIMEType(File aFile) {

String end = aFile.getName().substring(

aFile.getName().lastIndexOf(".") + 1, aFile.getName().length())

.toLowerCase();

String type = "";

if (end.equals("mp3") || end.equals("aac") ||

end.equals("aac")

|| end.equals("amr") ||

end.equals("mpeg") || end.equals("mp4")) {

type =

"audio";

} else if (end.equals("jpg") ||

end.equals("gif") || end.equals("png")

|| end.equals("jpeg")) {

type =

"image";

} else {

type =

"*";

}

type += "/*";

return type;

}

添加权限许可

如果只是写好了程序还不算完工,最后我们需要在AndroidManifest.xml文件中将程序的录音权限打开!这样才能成为一个完整的程序。

< manifest

xmlns:android="http://schemas.android.com/apk/res/android"

android:versionCode="1"

android:versionName="1.0"

package="com.ophone.iRecorder">

< application

android:icon="@drawable/icon"

android:label="@string/app_name">

<

activity android:name=".ActivityMain"

android:label="@string/app_name">

< intent-filter>

< action

android:name="android.intent.action.MAIN" />

< category

android:name="android.intent.category.LAUNCHER"

/>

< /intent-filter>

<

/activity>

< /application>

< uses-permission

android:name="android.permission.RECORD_AUDIO">

< /uses-permission>

< /manifest>

你可能感兴趣的:(Android媒体录制)