Android AudioRecord 始终读取 returns -3 (ERROR_INVALID_OPERATION)

Android AudioRecord read always returns -3 (ERROR_INVALID_OPERATION)

我已尝试将代码简化到最低限度,但仍然无法正常工作:

public class MainActivity extends AppCompatActivity {

AudioRecord rec;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    rec=  new AudioRecord(MediaRecorder.AudioSource.MIC,44100, AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT,8192);

    short buff[] = new short[8192];
    int read = rec.read(buff,0,buff.length);
    System.out.print(read);
}

总是returns -3 无论如何。我错过了什么?

您检查清单中的权限了吗?

</application>

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

文档说:

从音频硬件读取音频数据以记录到字节数组中。 AudioRecord构造函数中指定的格式应该是ENCODING_PCM_8BIT来对应数组中的数据

参数

audioData字节:写入录制音频数据的数组。 此值绝不能为空。

offsetInBytes int:写入数据的 audioData 中的索引,以字节表示。

sizeInBytes int:请求的字节数。 Returns

int 零或已读取的正字节数,或以下错误代码之一。字节数不会超过sizeInBytes.

ERROR_INVALID_OPERATION 如果对象没有正确初始化

我认为您应该检查 AudioRecord 对象的初始化。 所以看看这个答案:Android AudioRecord example

根据 Android 文档 -

-3表示是一个invalid operation.

Denotes a failure due to the improper use of a method.

Constant Value: -3 (0xfffffffd)

这个问题很可能是因为它无法使用您指定的参数创建 AudioRecord 实例。

创建对象后,尝试检查它是否通过 getState

方法正确初始化
    if (rec.getState() == AudioRecord.STATE_UNINITIALIZED) {
        // Oops looks like it was not initalized correctly
    }

如果确实是未初始化状态则尝试设置不同的音频属性。查看 AudioRecord [constructor](https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord(int, int, int, int, int) 的文档,该文档提供了有关如何初始化不同参数的全面详细信息。

与我的朋友一起,我们终于设法解决了这个问题。在调用 read() 之前需要先调用 AudioRecord.startRecording()。同样在你完成之后你应该调用 AudioRecord.stop()。我想知道为什么这么难找到这条基本信息