2017-06-17 31 views
7

我试图简化了代码到最低限度,它仍然不工作:的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不管。我错过了什么?

+0

我还是希望得到一些帮助,请 – AlanKalane

+0

好,所以朋友告诉我试着将数组大小改为缓冲区大小的一半。这使得它返回0。当然比-3更好,但仍然不起作用 – AlanKalane

回答

7

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

2

您是否检查过清单中的权限?

</application> 

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

文档说:

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

参数

audioData字节:数组到的记录的音频数据被写入。 该值不能为空。

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

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

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

ERROR_INVALID_OPERATION如果对象未正确初始化

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

+0

你在之后添加了它仍然没有任何结果。还尝试添加ActivityCompat.requestPermissions(this,new String [] {android.Manifest.permission.RECORD_AUDIO},200);所以现在它要求许可但不起作用 – AlanKalane

+0

你能在这里粘贴异常吗? –

+0

没有例外,它只是返回-3这是ERROR_INVALID_OPERATION的错误代码 – AlanKalane

1

按照Android文档 -

-3表明它是一个invalid operation

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

恒值:-3(0xfffffffd)

这个问题是最有可能,因为它不能与您指定的参数创建AudioRecord实例。

创建对象之后尝试检查它是否是通过该方法getState

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

正确初始化如果国家确实未初始化,然后尝试设置不同的音频性能。检查文档AudioRecord [构造函数](https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord(int,int,int,int,int)),文档提供了有关如何初始化不同参数的全面详细信息。

+0

不正确,初始化正确。 – AlanKalane

相关问题