Android 简明教程

Android - Audio Capture

Android 内置了麦克风,您可以通过麦克风捕捉音频并将其存储起来,或在手机中播放音频。有许多方法可以做到这一点,但最常见的方法是使用 MediaRecorder 类。

Android has a built in microphone through which you can capture audio and store it , or play it in your phone. There are many ways to do that but the most common way is through MediaRecorder class.

Android 提供 MediaRecorder 类来录制音频或视频。要使用 MediaRecorder 类,首先需要创建一个 MediaRecorder 类的实例。其语法如下。

Android provides MediaRecorder class to record audio or video. In order to use MediaRecorder class ,you will first create an instance of MediaRecorder class. Its syntax is given below.

MediaRecorder myAudioRecorder = new MediaRecorder();

现在,您将设置来源、输出和编码格式以及输出文件。其语法如下。

Now you will set the source , output and encoding format and output file. Their syntax is given below.

myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
myAudioRecorder.setOutputFile(outputFile);

在指定音频来源、格式及其输出文件后,我们就可以调用这两个基本方法“准备”和“开始”来开始录制音频。

After specifying the audio source and format and its output file, we can then call the two basic methods prepare and start to start recording the audio.

myAudioRecorder.prepare();
myAudioRecorder.start();

除了这些方法之外,MediaRecorder 类中还列出了其他方法,使您可以更多地控制音频和视频录制。

Apart from these methods , there are other methods listed in the MediaRecorder class that allows you more control over audio and video recording.

Sr.No

Method & description

1

setAudioSource() This method specifies the source of audio to be recorded

2

setVideoSource() This method specifies the source of video to be recorded

3

setOutputFormat() This method specifies the audio format in which audio to be stored

4

setAudioEncoder() This method specifies the audio encoder to be used

5

setOutputFile() This method configures the path to the file into which the recorded audio is to be stored

6

stop() This method stops the recording process.

7

release() This method should be called when the recorder instance is needed.

Example

本示例提供 MediaRecorder 类的演示,用于捕捉音频,然后提供 MediaPlayer 类来播放该录制音频。

This example provides demonstration of MediaRecorder class to capture audio and then MediaPlayer class to play that recorded audio.

要尝试此示例,您需要在实际设备上运行此示例。

To experiment with this example , you need to run this on an actual device.

Steps

Description

1

You will use Android studio IDE to create an Android application and name it as AudioCapture under a package com.example.sairamkrishna.myapplication.

2

Modify src/MainActivity.java file to add AudioCapture code

3

Modify layout XML file res/layout/activity_main.xml add any GUI component if required.

4

Modify AndroidManifest.xml to add necessary permissions.

5

Run the application and choose a running android device and install the application on it and verify the results.

以下是 src/MainActivity.java 的内容

Here is the content of src/MainActivity.java

package com.example.sairamkrishna.myapplication;

import android.media.MediaPlayer;
import android.media.MediaRecorder;

import android.os.Environment;
import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;

import android.widget.Button;
import android.widget.Toast;

import java.io.IOException;
import java.util.Random;

import static android.Manifest.permission.RECORD_AUDIO;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;

import android.support.v4.app.ActivityCompat;
import android.content.pm.PackageManager;
import android.support.v4.content.ContextCompat;

public class MainActivity extends AppCompatActivity {

   Button buttonStart, buttonStop, buttonPlayLastRecordAudio,
      buttonStopPlayingRecording ;
   String AudioSavePathInDevice = null;
   MediaRecorder mediaRecorder ;
   Random random ;
   String RandomAudioFileName = "ABCDEFGHIJKLMNOP";
   public static final int RequestPermissionCode = 1;
   MediaPlayer mediaPlayer ;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      buttonStart = (Button) findViewById(R.id.button);
      buttonStop = (Button) findViewById(R.id.button2);
      buttonPlayLastRecordAudio = (Button) findViewById(R.id.button3);
      buttonStopPlayingRecording = (Button)findViewById(R.id.button4);

      buttonStop.setEnabled(false);
      buttonPlayLastRecordAudio.setEnabled(false);
      buttonStopPlayingRecording.setEnabled(false);

      random = new Random();

      buttonStart.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {

            if(checkPermission()) {

               AudioSavePathInDevice =
                  Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
                     CreateRandomAudioFileName(5) + "AudioRecording.3gp";

               MediaRecorderReady();

               try {
                  mediaRecorder.prepare();
                  mediaRecorder.start();
               } catch (IllegalStateException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               } catch (IOException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               }

               buttonStart.setEnabled(false);
               buttonStop.setEnabled(true);

               Toast.makeText(MainActivity.this, "Recording started",
                  Toast.LENGTH_LONG).show();
            } else {
               requestPermission();
            }

         }
      });

      buttonStop.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {
            mediaRecorder.stop();
            buttonStop.setEnabled(false);
            buttonPlayLastRecordAudio.setEnabled(true);
            buttonStart.setEnabled(true);
            buttonStopPlayingRecording.setEnabled(false);

            Toast.makeText(MainActivity.this, "Recording Completed",
               Toast.LENGTH_LONG).show();
         }
      });

      buttonPlayLastRecordAudio.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) throws IllegalArgumentException,
            SecurityException, IllegalStateException {

            buttonStop.setEnabled(false);
            buttonStart.setEnabled(false);
            buttonStopPlayingRecording.setEnabled(true);

            mediaPlayer = new MediaPlayer();
            try {
               mediaPlayer.setDataSource(AudioSavePathInDevice);
               mediaPlayer.prepare();
            } catch (IOException e) {
               e.printStackTrace();
            }

            mediaPlayer.start();
            Toast.makeText(MainActivity.this, "Recording Playing",
               Toast.LENGTH_LONG).show();
         }
      });

      buttonStopPlayingRecording.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View view) {
            buttonStop.setEnabled(false);
            buttonStart.setEnabled(true);
            buttonStopPlayingRecording.setEnabled(false);
            buttonPlayLastRecordAudio.setEnabled(true);

            if(mediaPlayer != null){
               mediaPlayer.stop();
               mediaPlayer.release();
               MediaRecorderReady();
            }
         }
      });

   }

   public void MediaRecorderReady(){
      mediaRecorder=new MediaRecorder();
      mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
      mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
      mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
      mediaRecorder.setOutputFile(AudioSavePathInDevice);
   }

   public String CreateRandomAudioFileName(int string){
      StringBuilder stringBuilder = new StringBuilder( string );
      int i = 0 ;
      while(i < string ) {
         stringBuilder.append(RandomAudioFileName.
            charAt(random.nextInt(RandomAudioFileName.length())));

         i++ ;
      }
      return stringBuilder.toString();
   }

   private void requestPermission() {
      ActivityCompat.requestPermissions(MainActivity.this, new
         String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, RequestPermissionCode);
   }

   @Override
   public void onRequestPermissionsResult(int requestCode,
      String permissions[], int[] grantResults) {
      switch (requestCode) {
         case RequestPermissionCode:
            if (grantResults.length> 0) {
            boolean StoragePermission = grantResults[0] ==
               PackageManager.PERMISSION_GRANTED;
            boolean RecordPermission = grantResults[1] ==
               PackageManager.PERMISSION_GRANTED;

            if (StoragePermission && RecordPermission) {
               Toast.makeText(MainActivity.this, "Permission Granted",
                  Toast.LENGTH_LONG).show();
            } else {
               Toast.makeText(MainActivity.this,"Permission
                  Denied",Toast.LENGTH_LONG).show();
            }
         }
         break;
      }
   }

   public boolean checkPermission() {
      int result = ContextCompat.checkSelfPermission(getApplicationContext(),
         WRITE_EXTERNAL_STORAGE);
      int result1 = ContextCompat.checkSelfPermission(getApplicationContext(),
         RECORD_AUDIO);
      return result == PackageManager.PERMISSION_GRANTED &&
         result1 == PackageManager.PERMISSION_GRANTED;
   }
}

以下是 activity_main.xml 的内容。

Here is the content of activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin">

   <ImageView
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageView"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:src="@drawable/abc"/>

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Record"
      android:id="@+id/button"
      android:layout_below="@+id/imageView"
      android:layout_alignParentLeft="true"
      android:layout_marginTop="37dp"
   />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="STOP"
      android:id="@+id/button2"
      android:layout_alignTop="@+id/button"
      android:layout_centerHorizontal="true"
   />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Play"
      android:id="@+id/button3"
      android:layout_alignTop="@+id/button2"
      android:layout_alignParentRight="true"
      android:layout_alignParentEnd="true"
   />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="STOP PLAYING RECORDING "
      android:id="@+id/button4"
      android:layout_below="@+id/button2"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="10dp"
   />
</RelativeLayout>

以下是 Strings.xml 的内容

Here is the content of Strings.xml

<resources>
   <string name="app_name">My Application</string>
</resources>

以下是 AndroidManifest.xml 的内容

Here is the content of AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.sairamkrishna.myapplication" >

   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
   <uses-permission android:name="android.permission.RECORD_AUDIO" />
	<uses-permission android:name="android.permission.STORAGE" />

   <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >

      <activity
         android:name="com.example.sairamkrishna.myapplication.MainActivity"
         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>
</manifest>

我们尝试运行你的应用程序。我假设你已将你的 Android 手机设备连接至你的电脑。若要从 Android Studio 运行该应用程序,请打开你的一个项目活动文件,并点击工具栏中的运行图标。在启动你的应用程序之前,Android Studio 将会显示以下图像。

Let’s try to run your application. I assume you have connected your actual Android Mobile device with your computer. To run the app from Android studio, open one of your project’s activity files and click Run icon from the toolbar. Before starting your application, Android studio will display following images.

现在,你会看到停止和播放按钮默认处于禁用状态。只需按下录音按钮,你的应用程序就会开始录音。它将显示以下屏幕。

Now by default you will see stop and play button disable. Just press the Record button and your application will start recording the audio. It will display the following screen.

android audio recording

现在,只需按停止按钮,它就会将录音保存到外部 SD 卡。当你单击停止按钮时,将出现以下屏幕。

Now just press stop button and it will save the recorded audio to external sd card. When you click on stop button , the following screen would appear.

android stop button

现在,只需按播放按钮,录制的音频就会开始在设备上播放。单击播放按钮后,将出现以下消息。

Now just press the play button and and recorded audio will just start playing on the device. The following message appears when you click on play button.

android play button