Home » Android » java – Android AudioRecord read always returns -3 (ERROR_INVALID_OPERATION)

java – Android AudioRecord read always returns -3 (ERROR_INVALID_OPERATION)

Posted by: admin June 15, 2020 Leave a comment


I have tried simplifying the code to the bare minimum and it still doesn’t work:

public class MainActivity extends AppCompatActivity {

AudioRecord rec;
protected void onCreate(Bundle savedInstanceState) {
    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);

Always returns -3 no matter what. What am I missing?

How to&Answers:

Together with my friend we have finally managed to solve this issue. You need to call AudioRecord.startRecording() before calling read(). Also after you’re done you should call AudioRecord.stop(). I wonder why it’s so hard to find this basic piece of information


Did you checked the permissions in manifest ?


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

Documentation says :

Reads audio data from the audio hardware for recording into a byte array. The format specified in the AudioRecord constructor should be ENCODING_PCM_8BIT to correspond to the data in the array.


audioData byte: the array to which the recorded audio data is written.
This value must never be null.

offsetInBytes int: index in audioData from which the data is written expressed in bytes.

sizeInBytes int: the number of requested bytes.

int zero or the positive number of bytes that were read, or one of the following error codes. The number of bytes will not exceed sizeInBytes.

ERROR_INVALID_OPERATION if the object isn’t properly initialized

i think you should check the initialization of AudioRecord object.
So look at this answer : Android AudioRecord example


According to the Android documentation –

-3 indicates that it is an invalid operation.

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

Constant Value: -3 (0xfffffffd)

This problem is mostly likely because it couldn’t create an AudioRecord instance with the parameters that you have specified.

After you create the object try to check whether it was initialized correctly via the method getState

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

If it is the state is indeed uninitialized then try setting different audio properties. Check the documentation for AudioRecord [constructor](https://developer.android.com/reference/android/media/AudioRecord.html#AudioRecord(int, int, int, int, int)), the documentation provides a comprehensive details on how to initialize the different parameters.