Android - Audio Capture

Android 有一个内置麦克风,您可以通过它捕获音频并存储,或在手机中播放。有很多方法可以做到这一点,但最常见的方法是通过 MediaRecorder 类。

Android 提供 MediaRecorder 类来录制音频或视频。为了使用 MediaRecorder 类,您将首先创建 MediaRecord 类的实例。其语法如下所示。

  1. MediaRecorder myAudioRecorder = new MediaRecorder();

现在,您将设置源、输出和编码格式以及输出文件。它们的语法如下所示。

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

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

  1. myAudioRecorder.prepare();
  2. myAudioRecorder.start();

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

编号方法 & 描述
1

setAudioSource()

此方法指定要录制的音频源。

2

setVideoSource()

此方法指定要录制的视频源。

3

setOutputFormat()

此方法指定要存储音频的音频格式。

4

setAudioEncoder()

此方法指定要使用的音频编码器。

5

setOutputFile()

此方法配置要存储录制音频的文件的路径。

6

stop()

此方法停止录制过程。

7

release()

当需要记录器实例时,应调用此方法。


实例

本实例演示了 MediaRecorder 类捕获音频,然后 MediaPlayer 类播放录制的音频。

要实验这个实例实际设备上运行这个。

步骤描述
1您将使用 Android studio IDE 创建一个 Android 应用程序,并在 com.example.sairamkrishna.myapplication 包下将其命名为 AudioCapture
2修改 src/MainActivity.java 文件添加 AudioCapture 代码。
3修改布局 XML 文件 res/layout/activity_main.xml 添加 GUI 组件。
4修改 AndroidManifest.xml 添加必要的权限。
5运行应用程序并选择正在运行的 android 设备,并在其上安装应用程序并验证结果。

这是 src/MainActivity.java 文件的内容

  1. package com.example.sairamkrishna.myapplication;
  2. import android.media.MediaPlayer;
  3. import android.media.MediaRecorder;
  4. import android.os.Environment;
  5. import android.support.v7.app.AppCompatActivity;
  6. import android.os.Bundle;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.Toast;
  10. import java.io.IOException;
  11. import java.util.Random;
  12. import static android.Manifest.permission.RECORD_AUDIO;
  13. import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
  14. import android.support.v4.app.ActivityCompat;
  15. import android.content.pm.PackageManager;
  16. import android.support.v4.content.ContextCompat;
  17. public class MainActivity extends AppCompatActivity {
  18. Button buttonStart, buttonStop, buttonPlayLastRecordAudio,
  19. buttonStopPlayingRecording ;
  20. String AudioSavePathInDevice = null;
  21. MediaRecorder mediaRecorder ;
  22. Random random ;
  23. String RandomAudioFileName = "ABCDEFGHIJKLMNOP";
  24. public static final int RequestPermissionCode = 1;
  25. MediaPlayer mediaPlayer ;
  26. @Override
  27. protected void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.activity_main);
  30. buttonStart = (Button) findViewById(R.id.button);
  31. buttonStop = (Button) findViewById(R.id.button2);
  32. buttonPlayLastRecordAudio = (Button) findViewById(R.id.button3);
  33. buttonStopPlayingRecording = (Button)findViewById(R.id.button4);
  34. buttonStop.setEnabled(false);
  35. buttonPlayLastRecordAudio.setEnabled(false);
  36. buttonStopPlayingRecording.setEnabled(false);
  37. random = new Random();
  38. buttonStart.setOnClickListener(new View.OnClickListener() {
  39. @Override
  40. public void onClick(View view) {
  41. if(checkPermission()) {
  42. AudioSavePathInDevice =
  43. Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
  44. CreateRandomAudioFileName(5) + "AudioRecording.3gp";
  45. MediaRecorderReady();
  46. try {
  47. mediaRecorder.prepare();
  48. mediaRecorder.start();
  49. } catch (IllegalStateException e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. } catch (IOException e) {
  53. // TODO Auto-generated catch block
  54. e.printStackTrace();
  55. }
  56. buttonStart.setEnabled(false);
  57. buttonStop.setEnabled(true);
  58. Toast.makeText(MainActivity.this, "Recording started",
  59. Toast.LENGTH_LONG).show();
  60. } else {
  61. requestPermission();
  62. }
  63. }
  64. });
  65. buttonStop.setOnClickListener(new View.OnClickListener() {
  66. @Override
  67. public void onClick(View view) {
  68. mediaRecorder.stop();
  69. buttonStop.setEnabled(false);
  70. buttonPlayLastRecordAudio.setEnabled(true);
  71. buttonStart.setEnabled(true);
  72. buttonStopPlayingRecording.setEnabled(false);
  73. Toast.makeText(MainActivity.this, "Recording Completed",
  74. Toast.LENGTH_LONG).show();
  75. }
  76. });
  77. buttonPlayLastRecordAudio.setOnClickListener(new View.OnClickListener() {
  78. @Override
  79. public void onClick(View view) throws IllegalArgumentException,
  80. SecurityException, IllegalStateException {
  81. buttonStop.setEnabled(false);
  82. buttonStart.setEnabled(false);
  83. buttonStopPlayingRecording.setEnabled(true);
  84. mediaPlayer = new MediaPlayer();
  85. try {
  86. mediaPlayer.setDataSource(AudioSavePathInDevice);
  87. mediaPlayer.prepare();
  88. } catch (IOException e) {
  89. e.printStackTrace();
  90. }
  91. mediaPlayer.start();
  92. Toast.makeText(MainActivity.this, "Recording Playing",
  93. Toast.LENGTH_LONG).show();
  94. }
  95. });
  96. buttonStopPlayingRecording.setOnClickListener(new View.OnClickListener() {
  97. @Override
  98. public void onClick(View view) {
  99. buttonStop.setEnabled(false);
  100. buttonStart.setEnabled(true);
  101. buttonStopPlayingRecording.setEnabled(false);
  102. buttonPlayLastRecordAudio.setEnabled(true);
  103. if(mediaPlayer != null){
  104. mediaPlayer.stop();
  105. mediaPlayer.release();
  106. MediaRecorderReady();
  107. }
  108. }
  109. });
  110. }
  111. public void MediaRecorderReady(){
  112. mediaRecorder=new MediaRecorder();
  113. mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  114. mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  115. mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
  116. mediaRecorder.setOutputFile(AudioSavePathInDevice);
  117. }
  118. public String CreateRandomAudioFileName(int string){
  119. StringBuilder stringBuilder = new StringBuilder( string );
  120. int i = 0 ;
  121. while(i < string ) {
  122. stringBuilder.append(RandomAudioFileName.
  123. charAt(random.nextInt(RandomAudioFileName.length())));
  124. i++ ;
  125. }
  126. return stringBuilder.toString();
  127. }
  128. private void requestPermission() {
  129. ActivityCompat.requestPermissions(MainActivity.this, new
  130. String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, RequestPermissionCode);
  131. }
  132. @Override
  133. public void onRequestPermissionsResult(int requestCode,
  134. String permissions[], int[] grantResults) {
  135. switch (requestCode) {
  136. case RequestPermissionCode:
  137. if (grantResults.length> 0) {
  138. boolean StoragePermission = grantResults[0] ==
  139. PackageManager.PERMISSION_GRANTED;
  140. boolean RecordPermission = grantResults[1] ==
  141. PackageManager.PERMISSION_GRANTED;
  142. if (StoragePermission && RecordPermission) {
  143. Toast.makeText(MainActivity.this, "Permission Granted",
  144. Toast.LENGTH_LONG).show();
  145. } else {
  146. Toast.makeText(MainActivity.this,"Permission
  147. Denied",Toast.LENGTH_LONG).show();
  148. }
  149. }
  150. break;
  151. }
  152. }
  153. public boolean checkPermission() {
  154. int result = ContextCompat.checkSelfPermission(getApplicationContext(),
  155. WRITE_EXTERNAL_STORAGE);
  156. int result1 = ContextCompat.checkSelfPermission(getApplicationContext(),
  157. RECORD_AUDIO);
  158. return result == PackageManager.PERMISSION_GRANTED &amp;&amp;
  159. result1 == PackageManager.PERMISSION_GRANTED;
  160. }
  161. }

这是 activity_main.xml 文件的内容

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:paddingBottom="@dimen/activity_vertical_margin"
  7. android:paddingLeft="@dimen/activity_horizontal_margin"
  8. android:paddingRight="@dimen/activity_horizontal_margin"
  9. android:paddingTop="@dimen/activity_vertical_margin">
  10. <ImageView
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:id="@+id/imageView"
  14. android:layout_alignParentTop="true"
  15. android:layout_centerHorizontal="true"
  16. android:src="@drawable/abc"/>
  17. <Button
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:text="Record"
  21. android:id="@+id/button"
  22. android:layout_below="@+id/imageView"
  23. android:layout_alignParentLeft="true"
  24. android:layout_marginTop="37dp"
  25. />
  26. <Button
  27. android:layout_width="wrap_content"
  28. android:layout_height="wrap_content"
  29. android:text="STOP"
  30. android:id="@+id/button2"
  31. android:layout_alignTop="@+id/button"
  32. android:layout_centerHorizontal="true"
  33. />
  34. <Button
  35. android:layout_width="wrap_content"
  36. android:layout_height="wrap_content"
  37. android:text="Play"
  38. android:id="@+id/button3"
  39. android:layout_alignTop="@+id/button2"
  40. android:layout_alignParentRight="true"
  41. android:layout_alignParentEnd="true"
  42. />
  43. <Button
  44. android:layout_width="wrap_content"
  45. android:layout_height="wrap_content"
  46. android:text="STOP PLAYING RECORDING "
  47. android:id="@+id/button4"
  48. android:layout_below="@+id/button2"
  49. android:layout_centerHorizontal="true"
  50. android:layout_marginTop="10dp"
  51. />
  52. </RelativeLayout>

这是 Strings.xml 的内容

  1. <resources>
  2. <string name="app_name">My Application</string>
  3. </resources>

这是 AndroidManifest.xml 的内容

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.sairamkrishna.myapplication" >
  4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  5. <uses-permission android:name="android.permission.RECORD_AUDIO" />
  6. <uses-permission android:name="android.permission.STORAGE" />
  7. <application
  8. android:allowBackup="true"
  9. android:icon="@drawable/ic_launcher"
  10. android:label="@string/app_name"
  11. android:theme="@style/AppTheme" >
  12. <activity
  13. android:name="com.example.sairamkrishna.myapplication.MainActivity"
  14. android:label="@string/app_name" >
  15. <intent-filter>
  16. <action android:name="android.intent.action.MAIN" />
  17. <category android:name="android.intent.category.LAUNCHER" />
  18. </intent-filter>
  19. </activity>
  20. </application>
  21. </manifest>

让我们尝试运行您的应用程序。我假设你已经将实际的 Android 移动设备与计算机连接。要从 Android studio 运行应用程序,请打开项目的一个活动文件,然后单击工具栏上的运行 Eclipse Eclipse Run Icon 图标。在启动应用程序之前,Android工作室将显示以下图像。

现在默认情况下,您将看到 stop 停止和 play 播放按钮禁用。只需按下 Record 录制按钮,您的应用程序就会开始录制音频。它将显示以下屏幕。

现在只需按下 stop 停止按钮,它就会将录制的音频保存到外部 sd 卡。当您单击停止按钮时,将出现以下屏幕。

现在只需按下 play 播放按钮,录制的音频将在设备上开始播放。单击播放按钮时,将显示以下消息。