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 宁静致远,一览众山小 阅读(279) 评论(0) 编辑 收藏 举报