Android AudioRecord读取总是返回-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); } 

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

Solutions Collecting From Web of "Android AudioRecord读取总是返回-3(ERROR_INVALID_OPERATION)"

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

你有没有检查清单中的权限?

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

文档说:

从audio硬件中读取audio数据以logging到字节数组中。 AudioRecord构造函数中指定的格式应该是ENCODING_PCM_8BIT以对应于数组中的数据。

参数

audioData byte:写入录制audio数据的数组。 该值不能为空。

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

sizeInBytes int:请求的字节数。 返回

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

如果对象未正确初始化,则返回ERROR_INVALID_OPERATION

我想你应该检查AudioRecord对象的初始化。 所以看看这个答案: Android AudioRecord的例子

根据Android文档 –

-3表示这是一个无效的操作 。

表示由于不正确使用方法而导致的失败。

常量值:-3(0xfffffffd)

这个问题很可能是因为它不能用你指定的参数创build一个AudioRecord实例。

在创build对象之后,尝试通过getState方法检查它是否被正确初始化

  if (rec.getState() == AudioRecord.STATE_UNINITIALIZED) { // Oops looks like it was not initalized correctly } 

如果确实是未初始化的状态,则尝试设置不同的audio属性。 检查AudioRecord [构造函数]( https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord (int,int,int,int))的文档,文档提供了关于如何初始化不同的参数。