MediaRecorder.start () throws an IllegalStateException

I read similar topics and did not find an answer that would solve my problem.

I am writing an application with two different MediaRecorders. One for noise detection and one for recording. What I want to do is when the first MediaRecorder detects noise levels above 4.0 (I use the Google SoundMeter class to detect), it initiates another MediaRecorder and starts recording. If sound levels remain below 4.0 for 10 seconds, stop recording and continue listening. All this is done in AsynTask, in an infinite while (true) loop, which will be broken only if the corresponding button is pressed.

The discovery works fine, but an IllegalStateException is thrown when the start () function is called on the MediaRecorder record.

Here is the AsyncTask:

private class NoiseDetection extends AsyncTask {
    double currentSoundInputLevel;

    @Override
    protected Object doInBackground(Object[] params) {
        int i = 0;
        soundMeter = new SoundMeter();
        try {
            soundMeter.start();
        } catch (IOException e) {
            Log.e("error", e.getMessage());
        }
        while(true){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Log.e("error", e.getMessage());
            }
            if(isCancelled()){
                soundMeter.stop();
                if(currentlyRecording) {
                    soundRecorder.stop();
                }
                break;
            }
            currentSoundInputLevel = soundMeter.getAmplitudeEMA();
            if(!currentlyRecording && currentSoundInputLevel > 4.0){
                soundRecorder = new SoundRecorder();
                try {
                    soundRecorder.start(getFileNameString());
                    currentlyRecording = true;
                } catch (IOException e) {
                    Log.e("error", e.getMessage());
                }
            } else if(currentlyRecording && currentSoundInputLevel < 4.0) {
                i++;
                if(i > 10) {
                    soundRecorder.stop();
                }
            }
        }
        return null;
    }
}

SoundRecorder:

public class SoundRecorder {
    private MediaRecorder mRecorder = null;

    public void start(String fileName) throws IOException {
        if (mRecorder == null) {
            mRecorder = new MediaRecorder();
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            mRecorder.setOutputFile(Environment.getExternalStorageDirectory().getPath() + "/" + fileName);
            mRecorder.prepare();
            mRecorder.start();
        }
    }

    public void stop() {
        if (mRecorder != null) {
            mRecorder.stop();
            mRecorder.release();
            mRecorder = null;
        }
    }
}

mRecorder.start();.

, , . , OutputFormats AudioEncoders . ( qaru.site/questions/1567982/...)

, , , sdcard.

, , - Nexus 5. android :

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

Update:

SoundRecorder while, RecordingHandler. doInBackground() :

    protected Object doInBackground(Object[] params) {
        int i = 0;
        soundMeter = new SoundMeter();
        RecordingHandler recordingHandler = null;
        try {
            soundMeter.start();
        } catch (IOException e) {
            Log.e("error", e.getMessage());
        }
        while(true){
            if(isCancelled()){
                soundMeter.stop();
                if(currentlyRecording && recordingHandler != null){
                    recordingHandler.kill();
                }
                break;
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Log.e("error", e.getMessage());
            }
            if(!currentlyRecording && soundMeter.getAmplitudeEMA() > 4.0){
                recordingHandler =  new RecordingHandler(deviceId);
                currentlyRecording = true;
                recordingHandler.run();
            }
        }
        return null;
    }

RecordingHandler :

public class RecordingHandler implements Runnable {

    SoundRecorder soundRecorder;
    SoundMeter soundMeter;
    String deviceID;
    boolean isKilled = false;

    public RecordingHandler(String deviceID){
        this.soundRecorder = new SoundRecorder();
        this.soundMeter = new SoundMeter();
        this.deviceID = deviceID;
    }

    @Override
    public void run() {
        int i = 0;
        try {
            soundMeter.start();
            soundRecorder.start(getFileNameString());
        } catch (IOException e) {
            Log.e("error", e.getMessage());
        }
        while(true){
            if(isKilled){
                break;
            }
            if(soundMeter.getAmplitudeEMA() < 4.0){
                i++;
                if(i > 10){
                    break;
                }
            } else {
                i = 0;
            }
        }
        soundMeter.stop();
        soundRecorder.stop();
        EavesDrop.currentlyRecording = false;
    }

    public void kill(){
        this.isKilled = true;
    }

    private String getFileNameString() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        return deviceID + "_" + sdf.format(new Date());
    }
}

IllegalStateException Recordinghandler - soundMeter.start();. , soundMeter , , while . -, ? MediaRecorders? , SoundMeter, SoundRecorder, . - , start() RecordingHandler, IllegalStateException.

Android: , , .

!

+4
1

, , . , MediaRecorder. , , , , .

SoundMeter, , 4.0. SoundMeter SoundMeter ( ), , 4.0 apprixamtely 10 . SoundMeter , SoundMeter.

, , AsyncTask:

    protected Object doInBackground(Object[] params) {
        int i = 0;
        soundMeter = new SoundMeter();
        RecordingHandler recordingHandler = null;
        try {
            soundMeter.start("/dev/null");
        } catch (IOException e) {
            Log.e("error", e.getMessage());
        }
        while(true){
            if(isCancelled()){
                soundMeter.stop();
                if(currentlyRecording && recordingHandler != null){
                    recordingHandler.kill();
                }
                break;
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Log.e("error", e.getMessage());
            }
            if(!currentlyRecording && soundMeter.getAmplitudeEMA() > 4.0){
                soundMeter.stop();
                recordingHandler =  new RecordingHandler(deviceId);
                currentlyRecording = true;
                recordingHandler.run();
            } else if(!currentlyRecording && !soundMeter.isRunning()){
                try {
                    soundMeter.start("/dev/null");
                } catch (IOException e) {
                    Log.e("error", e.getMessage());
                }
            }
        }
        return null;
    }
}

RecordingHandler.run():

@Override
public void run() {
    int i = 0;
    try {
        soundMeter.start(getFileNameString());
    } catch (IOException e) {
        Log.e("error", e.getMessage());
    }
    while(true){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Log.e("error", e.getMessage());
        }
        if(isKilled){
            break;
        }
        if(soundMeter.getAmplitudeEMA() < 4.0){
            i++;
            if(i > 10){
                break;
            }
        } else {
            i = 0;
        }
    }
    soundMeter.stop();
    EavesDrop.currentlyRecording = false;
}

http://developer.android.com/reference/android/media/MediaRecorder.html release() , . , , .

0

Source: https://habr.com/ru/post/1567980/


All Articles