7.1 通过意图捕获音频

    在一个应用程序中,实现音频录制功能的最简单的方式是通过一个意图利用已有的、提供录制功能的应用程序。针对音频,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>

     如你所见,只添加音频录制功能非常简单。虽然他不允许过多的控制用户界面或录制的其他方面,但是它确实向用户提供了一个朴素的界面,而无需做太多的工作。

posted on 2014-08-29 16:27  宁静致远,一览众山小  阅读(267)  评论(0编辑  收藏  举报

导航