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";
@Override
protected 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/AudiioRecordTest
Log.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() {
@Override
public 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);
}
}
}