zoukankan      html  css  js  c++  java
  • 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>

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

  • 相关阅读:
    [NOIP提高&洛谷P1024]一元三次方程求解 题解(二分答案)
    浅谈二分答案的原理和相关应用
    Python 30分钟入门指南
    LG P1721 [NOI2016]国王饮水记
    LG P5238 整数校验器
    亡灵序曲
    线性代数三部曲(三)&#183;矩阵
    线性代数三部曲(二)·Gauss消元
    关于$color{darkblue}{Anverking}$的介绍
    线性代数三部曲(一)&#183;行列式
  • 原文地址:https://www.cnblogs.com/ZSS-Android/p/3945253.html
Copyright © 2011-2022 走看看