1.添加录音权限:在你的AndroidManifest.xml文件中,添加以下权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
第一个权限允许你的应用录制音频,第二个权限允许你的应用将录音保存到存储设备上。
2.添加录音按钮:在你的通话界面布局文件中,添加一个录音按钮。例如,可以在你的activity_main.xml文件中添加一个Button控件:
<Button
android:id="@+id/recordButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="录音" />
3.录音功能的实现:在你的Activity或Fragment类中,添加以下代码:
import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private Button recordButton;
private AudioRecord audioRecord;
private boolean isRecording = false;
private Thread recordingThread;
private String recordFilePath;
// 音频参数
private static final int AUDIO_SOURCE = MediaRecorder.AudioSource.VOICE_COMMUNICATION;
private static final int SAMPLE_RATE = 8000;
private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO;
private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recordButton = findViewById(R.id.recordButton);
recordButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isRecording) {
stopRecording();
} else {
startRecording();
}
}
});
}
// 开始录音
private void startRecording() {
isRecording = true;
recordButton.setText("停止录音");
audioRecord = new AudioRecord(AUDIO_SOURCE, SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT,
AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT) * 10);
// 创建保存录音文件的目录
File recordDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Recordings");
if (!recordDir.exists()) {
recordDir.mkdirs();
}
// 创建录音文件
String fileName = "recording_" + System.currentTimeMillis() + ".pcm";
File recordFile = new File(recordDir, fileName);
recordFilePath = recordFile.getAbsolutePath();
recordingThread = new Thread(new Runnable() {
@Override
public void run() {
try {
// 创建文件输出流
DataOutputStream outputStream = new DataOutputStream(new FileOutputStream(recordFile));
byte[] buffer = new byte[8192];
audioRecord.startRecording();
while (isRecording) {
int read = audioRecord.read(buffer, 0, buffer.length);
if (read > 0) {
outputStream.write(buffer, 0, read);
}
}
audioRecord.stop();
audioRecord.release();
audioRecord = null;
outputStream.close();
runOnUiThread(new Runnable() {
@Override
public void run() {
recordButton.setText("开始录音");
Toast.makeText(MainActivity.this, "录音已保存:" + recordFilePath, Toast.LENGTH_LONG).show();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
});
recordingThread.start();
}
// 停止录音
private void stopRecording() {
isRecording = false;
}
@Override
protected void onDestroy() {
super.onDestroy();
if (isRecording) {
stopRecording();
}
}
}
在 onCreate 方法中初始化录音按钮并为其添加点击事件监听器。当录音按钮被点击时,根据当前录音状态执行开始或停止录音的操作。
在 startRecording() 方法中,首先设置录音状态和按钮文本,在创建 AudioRecord 对象前,我们创建了保存录音文件的目录,并生成录音文件路径。接下来,我们创建了一个录音线程,该线程在循环中读取音频数据并将其写入文件。当停止录音时,我们停止 AudioRecord,释放资源,并关闭输出流。最后,在主线程中更新按钮文本并显示保存录音文件的提示。
在 stopRecording() 方法中,我们将录音状态设置为 false,以便让录音线程退出循环并停止录音。