在一个应用程序中,实现音频录制功能的最简单的方式是通过一个意图利用已有的、提供录制功能的应用程序。针对音频,Android附带一个能够以这种方式触发的录音机应用程序。
在MediaStore.Audio.Media类中存在的常量RECORD_SOUND_ACTION可用来实现创建该意图的动作。以下是触发内置录音机的基本代码。
1 Intent intent=new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
2 startActivityForResult(intent, RECODE_REQUEST);
当然,为了获取用户创建的录音,我们将希望使用startActivityForResult方法,而非仅仅使用startActivity。
下面是通过一个意图触发内置录音机的示例。当用户完成操作之后,使用MediaPlayer播放音频文件。
1 package com.nthm.androidtestActivity;
2
3 import com.nthm.androidtest.R;
4 import android.app.Activity;
5 import android.content.Intent;
6 import android.media.MediaPlayer;
7 import android.media.MediaPlayer.OnCompletionListener;
8 import android.net.Uri;
9 import android.os.Bundle;
10 import android.provider.MediaStore;
11 import android.view.View;
12 import android.view.View.OnClickListener;
13 import android.widget.Button;
该活动实现了OnClickListener,从而可以响应按钮的单击事件;同时它实现了OnCompletionListener,从而当MediaPlayer完成播放音频时可以得到通知。
1 public class IntentAudioRecorder extends Activity implements OnClickListener,
2 OnCompletionListener {
然后创建一个名为RECODE_REQUEST的常量,并将它传递给startActivityForResult函数,从而可以确定任何onActivityResult调用(其将在录音机结束操作时被调用)的来源。
当由startActivityForResult函数触发时,任何活动在返回时都将调用onActivityResult方法。通过将一个独特的常量连同意图一起传入,我们能够在onActivityResult方法中对它们进行区分。
1 public static int RECODE_REQUEST=0;
2 private Button createRecording;
3 private Button playRecording;
需要一个Uri对象来包含将由录音机活动录制的音频文件的URI。
1 private Uri audioFileUri;
2 @Override
3 protected void onCreate(Bundle savedInstanceState) {
4 super.onCreate(savedInstanceState);
5 setContentView(R.layout.intentaudiorecorder);
在设置完内容视图之后,可以获得Button对象的引用。每个按钮的单击事件监听器都被设置为this,从而在单击按钮时调用活动的onClick方法。同样,设置playRecording按钮在播放一个音频文件之后(从录音机活动中得到结果)才会被启用。
1 createRecording=(Button) findViewById(R.id.RecordButton);
2 playRecording=(Button) findViewById(R.id.PlayButton);
3 createRecording.setOnClickListener(this);
4 playRecording.setOnClickListener(this);
5 playRecording.setEnabled(false);
6 }
当单击任何一个按钮时,都将触发onClick方法。如果单击createRecording按钮,那么通过MediaStore.Audio.Media.RECORD_SOUND_ACTION动作(在传递给startActivityForResult的意图中)触发该录音机活动。
1 @Override
2 public void onClick(View v) {
3 if(v==createRecording){
4 Intent intent=new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION);
5 startActivityForResult(intent, RECODE_REQUEST);
6 }else if(v==playRecording){
如果单击playRecording按钮,那么创建一个MediaPlayer对象,并将它设置为播放由Uri表示的音频文件,该Uri将从录音机活动中返回,并在audioFileUri对象中保存。
同时还将MediaPlayer的OnCompletionListener设置为自身,从而当完成播放时调用onCompletion方法。由于禁用了playRecording按钮,因此只有当准备好之后,用户才能够再次出发播放。
1 MediaPlayer mediaPlayer=MediaPlayer.create(this, audioFileUri);
2 mediaPlayer.setOnCompletionListener(this);
3 mediaPlayer.start();
4 playRecording.setEnabled(false);
5 }
6 }
当录音机活动完成时触发onActivityResult方法。resultCode应该等于RESULT_OK常量,而requestCode应该等于传递给startActivityForResult方法的值,即RECODE_REQUEST。如果两个等式都为真,就可以获得录制文件的URI,即在getData方法返回的意图中将它提取出来。一旦完成以上动作,就能够启用playRecording按钮,从而可以播放返回的音频文件。
1 @Override
2 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
3 super.onActivityResult(requestCode, resultCode, data);
4 if(resultCode==RESULT_OK&&requestCode==RECODE_REQUEST){
5 audioFileUri=data.getData();
6 playRecording.setEnabled(true);
7 }
8 }
最后,当MediaPlayer完成播放一个文件时会调用onCompletion方法其中将重新启用playRecording按钮,使用户能够再次收听音频文件,如果他或她这么选择的话。
1 @Override
2 public void onCompletion(MediaPlayer mp) {
3 playRecording.setEnabled(true);
4 }
5 }
下面是用于上述活动的布局XML。
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="match_parent"
3 android:layout_height="match_parent"
4 android:orientation="vertical"
5 >
6 <Button
7 android:layout_width="fill_parent"
8 android:layout_height="wrap_content"
9 android:text="Record Audio"
10 android:id="@+id/RecordButton" />
11 <Button
12 android:layout_width="fill_parent"
13 android:layout_height="wrap_content"
14 android:text="Playing recording"
15 android:id="@+id/PlayButton" />
16 </LinearLayout>
如你所见,只添加音频录制功能非常简单。虽然他不允许过多的控制用户界面或录制的其他方面,但是它确实向用户提供了一个朴素的界面,而无需做太多的工作。