一、概述
AudioRecord 是 Android 平台比较重要的类,也是 Java 接口中比较偏底层(平台)的接口,可以通过它从平台的音频输入硬件来获取原始音频 PCM 数据。它的工作原理是要需要通过应用侧轮询调用 read 接口来驱动,每调用一次,系统就会从硬件采集到的数据填充一次,至于传递数据的载体可以是 byte[] 数组 或者 ByteBuffer 。
二、所需权限
应用程序创建 AudioRecord 实例需要在AndroidManifest文件赋予 Manifest.permission.RECORD_AUDIO 权限。没有赋予这个权限,如果使用 AudioRecord.Builder 来构建的话,执行build()函数会抛出 UnsupportedOperationException 异常,即使您捕获了此异常,在获取 AudioRecord 状态 的时候,也是未初始化状态(STATE_UNINITIALIZED)。
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
在 API 23 (Android 6.0) 之后,为了保护用户隐私,对于一些敏感权限(比如录音权限),应用需要在运行时动态申请。示例代码如下:
private static final int PERMISSION_REQUEST_CODE = 1;
// step1: 检查是否有录音权限
private boolean checkPermission() {
int result = ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO);
return result == PackageManager.PERMISSION_GRANTED;
}
// step2: 请求录音权限
private void requestPermission() {
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.RECORD_AUDIO}, PERMISSION_REQUEST_CODE);
}
// step3: 处理权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限被授予,可以进行录音
startRecording();
} else {
// 权限