1.需要添加权限
<uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.FLASHLIGHT" /><uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"tools:ignore="ScopedStorage" /><uses-permission android:name="android.permission.RECORD_AUDIO"/><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.INTERNET" /><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.autofocus" />
android:requestLegacyExternalStorage="true"
2.code部分
package com.example.audioacquisitionapplication;import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import android.Manifest;
import android.annotation.SuppressLint;
import android.content.pm.PackageManager;
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;public class MainActivity extends AppCompatActivity {Button startRecordingButton, stopRecordingButton;//开始录音、停止录音File recordingFile;//储存AudioRecord录下来的文件boolean isRecording = false; //true表示正在录音AudioRecord audioRecord = null;File parent = null;//文件目录int bufferSize = 0;//最小缓冲区大小int sampleRateInHz = 48000;//采样率int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO; //单声道int audioFormat = AudioFormat.ENCODING_PCM_16BIT; //量化位数String TAG = "AudioRecord";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();requestPermission();}//初始化public void init() {startRecordingButton = (Button) findViewById(R.id.StartRecordingButton);stopRecordingButton = (Button) findViewById(R.id.StopRecordingButton);bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);//计算最小缓冲区Log.d("size is ", String.valueOf(bufferSize));if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {// TODO: Consider calling// ActivityCompat#requestPermissions// here to request the missing permissions, and then overriding// public void onRequestPermissionsResult(int requestCode, String[] permissions,// int[] grantResults)// to handle the case where the user grants the permission. See the documentation// for ActivityCompat#requestPermissions for more details.return;}audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz, channelConfig, audioFormat, bufferSize);//创建AudioRecorder对象parent = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ "/AudiioRecordTest");///storage/emulated/0/AudiioRecordTestLog.d("PATH is ",parent.getPath());if(!parent.exists())parent.mkdirs();//创建文件夹}@SuppressLint("NonConstantResourceId")public void onClick(View v) {switch (v.getId()) {//开始录音case R.id.StartRecordingButton:{Log.d("开始录音","ok");record();break;}//停止录音case R.id.StopRecordingButton:{Log.d("停止录音","ok");stopRecording();break;}}}//开始录音public void record() {isRecording = true;new Thread(new Runnable() {@Overridepublic void run() {isRecording = true;recordingFile = new File(parent,"audiotest.pcm");if(recordingFile.exists()){recordingFile.delete();}try {recordingFile.createNewFile();}catch (IOException e) {e.printStackTrace();Log.e(TAG,"创建储存音频文件出错");}try {DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(recordingFile)));byte[] buffer = new byte[bufferSize];audioRecord.startRecording();//开始录音int r = 0;while (isRecording) {int bufferReadResult = audioRecord.read(buffer,0,bufferSize);for (int i = 0; i < bufferReadResult; i++){dos.write(buffer[i]);}r++;}audioRecord.stop();//停止录音audioRecord.release();audioRecord = null;dos.close();} catch (Throwable t) {Log.e(TAG, "Recording Failed");}}}).start();}//停止录音public void stopRecording(){isRecording = false;}public void requestPermission() {if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {Toast.makeText(this, "申请权限", Toast.LENGTH_SHORT).show();// 申请 相机 麦克风权限ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.RECORD_AUDIO,Manifest.permission.READ_EXTERNAL_STORAGE}, 100);}}}