如何在Android中一次录制多个音频曲目

如何在Android中一次录制多个音频曲目,android,audio,illegalstateexception,mediarecorder,Android,Audio,Illegalstateexception,Mediarecorder,我一直在开发一个应用程序,该应用程序需要能够同时从麦克风录制两个不同的文件,但我不断收到非法状态异常,我的应用程序崩溃 当我一次只录制一条时,代码运行良好,但我希望能够同时录制这两条代码 活动代码 rec_sound_1 = (Button) findViewById(R.id.rec_sound_1); rec_sound_1.animate().setDuration(105); rec_sound_1.setOnTouchListener(new View.

我一直在开发一个应用程序,该应用程序需要能够同时从麦克风录制两个不同的文件,但我不断收到非法状态异常,我的应用程序崩溃

当我一次只录制一条时,代码运行良好,但我希望能够同时录制这两条代码

活动代码

rec_sound_1 = (Button) findViewById(R.id.rec_sound_1);
        rec_sound_1.animate().setDuration(105);
        rec_sound_1.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {

                if (arg1.getAction() == MotionEvent.ACTION_DOWN) {
                    //begin recording
                    try {
                        RecordingHandler.beginRecording1(SOUND_ONE);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    rec_sound_1.animate().setInterpolator(sDecelerator)
                            .scaleX(.85f).scaleY(.85f);
                } else if (arg1.getAction() == MotionEvent.ACTION_UP) {
                    rec_sound_1.animate().setInterpolator(sOvershooter)
                            .scaleX(1f).scaleY(1f);
                    //stop recording
                    RecordingHandler.stopRecording1();
                }
                return false;
            }
        });

        rec_sound_2 = (Button) findViewById(R.id.rec_sound_2);
        rec_sound_2.animate().setDuration(105);
        rec_sound_2.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {

                if (arg1.getAction() == MotionEvent.ACTION_DOWN) {
                    //begin recording
                    try {
                        RecordingHandler.beginRecording2(SOUND_TWO);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    rec_sound_2.animate().setInterpolator(sDecelerator)
                            .scaleX(.85f).scaleY(.85f);
                } else if (arg1.getAction() == MotionEvent.ACTION_UP) {
                    rec_sound_2.animate().setInterpolator(sOvershooter)
                            .scaleX(1f).scaleY(1f);
                    //stop recording
                    RecordingHandler.stopRecording2();
                }
                return false;
            }
        });

        rec_sound_3 = (Button) findViewById(R.id.rec_sound_3);
        rec_sound_3.animate().setDuration(105);
        rec_sound_3.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {

                if (arg1.getAction() == MotionEvent.ACTION_DOWN) {
                    //begin recording
                    try {
                        RecordingHandler.beginRecording3(SOUND_THREE);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    rec_sound_3.animate().setInterpolator(sDecelerator)
                            .scaleX(.85f).scaleY(.85f);
                } else if (arg1.getAction() == MotionEvent.ACTION_UP) {
                    rec_sound_3.animate().setInterpolator(sOvershooter)
                            .scaleX(1f).scaleY(1f);
                    //stop recording
                    RecordingHandler.stopRecording3();
                }
                return false;
            }
        });

        rec_sound_4 = (Button) findViewById(R.id.rec_sound_4);
        rec_sound_4.animate().setDuration(105);
        rec_sound_4.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {

                if (arg1.getAction() == MotionEvent.ACTION_DOWN) {
                    //begin recording
                    try {
                        RecordingHandler.beginRecording4(SOUND_FOUR);
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    rec_sound_4.animate().setInterpolator(sDecelerator)
                            .scaleX(.85f).scaleY(.85f);
                } else if (arg1.getAction() == MotionEvent.ACTION_UP) {
                    rec_sound_4.animate().setInterpolator(sOvershooter)
                            .scaleX(1f).scaleY(1f);
                    //stop recording
                    RecordingHandler.stopRecording4();
                }
                return false;
            }
        });
记录处理程序

public class RecordingHandler {

    private static MediaRecorder recorder1;
    private static MediaRecorder recorder2;
    private static MediaRecorder recorder3;
    private static MediaRecorder recorder4;

    static void beginRecording1(String output) throws Exception {
        ditchMediaRecorder1();
        File outFile = new File(output);        
        if(outFile.exists())
            outFile.delete();       
        recorder1 = new MediaRecorder();
        recorder1.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder1.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder1.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
        recorder1.setAudioEncodingBitRate(16);
        recorder1.setAudioSamplingRate(44100);
        recorder1.setOutputFile(output);
        recorder1.prepare();
        recorder1.start(); 
    }
    private static void ditchMediaRecorder1() {
        //if we have the recorder, release it
        if(recorder1 != null)
            recorder1.release(); }  
    static void stopRecording1() {
        if(recorder1 != null)
            recorder1.stop(); }

    static void beginRecording2(String output) throws Exception {
        ditchMediaRecorder2();
        File outFile = new File(output);        
        if(outFile.exists())
            outFile.delete();       
        recorder2 = new MediaRecorder();
        recorder2.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder2.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder2.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
        recorder2.setAudioEncodingBitRate(16);
        recorder2.setAudioSamplingRate(44100);
        recorder2.setOutputFile(output);
        recorder2.prepare();
        recorder2.start(); 
    }
    private static void ditchMediaRecorder2() {
        //if we have the recorder, release it
        if(recorder2 != null)
            recorder2.release(); }  
    static void stopRecording2() {
        if(recorder2 != null)
            recorder2.stop(); }

    static void beginRecording3(String output) throws Exception {
        ditchMediaRecorder3();
        File outFile = new File(output);        
        if(outFile.exists())
            outFile.delete();       
        recorder3 = new MediaRecorder();
        recorder3.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder3.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder3.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
        recorder3.setAudioEncodingBitRate(16);
        recorder3.setAudioSamplingRate(44100);
        recorder3.setOutputFile(output);
        recorder3.prepare();
        recorder3.start(); 
    }
    private static void ditchMediaRecorder3() {
        //if we have the recorder, release it
        if(recorder3 != null)
            recorder3.release(); }  
    static void stopRecording3() {
        if(recorder3 != null)
            recorder3.stop(); }

    static void beginRecording4(String output) throws Exception {
        ditchMediaRecorder4();
        File outFile = new File(output);        
        if(outFile.exists())
            outFile.delete();       
        recorder4 = new MediaRecorder();
        recorder4.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder4.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        recorder4.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_WB);
        recorder4.setAudioEncodingBitRate(16);
        recorder4.setAudioSamplingRate(44100);
        recorder4.setOutputFile(output);
        recorder4.prepare();
        recorder4.start(); 
    }
    private static void ditchMediaRecorder4() {
        //if we have the recorder, release it
        if(recorder4 != null)
            recorder4.release(); }  
    static void stopRecording4() {
        if(recorder4 != null)
            recorder4.stop(); }
一次录制两个文件时出现的错误类型

04-14 20:34:01.676: E/MediaRecorder(21510): stop called in an invalid state: 0
04-14 20:34:01.676: E/InputEventReceiver(21510): Exception dispatching input event.
04-14 20:34:01.676: E/MessageQueue-JNI(21510): Exception in MessageQueue callback: handleReceiveCallback
04-14 20:34:01.686: E/MessageQueue-JNI(21510): java.lang.IllegalStateException
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.media.MediaRecorder.stop(Native Method)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at com.appulse.audiomate.RecordingHandler.stopRecording2(RecordingHandler.java:62)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at com.appulse.audiomate.SoundRecord$2.onTouch(SoundRecord.java:101)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.View.dispatchTouchEvent(View.java:7701)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2238)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.app.Activity.dispatchTouchEvent(Activity.java:2458)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.View.dispatchPointerEvent(View.java:7886)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3954)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3833)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5602)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5582)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5553)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5682)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.os.MessageQueue.nativePollOnce(Native Method)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.os.MessageQueue.next(MessageQueue.java:138)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.os.Looper.loop(Looper.java:123)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at android.app.ActivityThread.main(ActivityThread.java:5017)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at java.lang.reflect.Method.invokeNative(Native Method)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at java.lang.reflect.Method.invoke(Method.java:515)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
04-14 20:34:01.686: E/MessageQueue-JNI(21510):  at dalvik.system.NativeStart.main(Native Method)

大多数Android设备在任何给定时间都不允许多个录制活动。您可能需要在应用程序中实现流拆分器(即,使用单个
录音
从麦克风读取PCM数据,允许多个客户端访问数据,让每个客户端根据需要对数据进行编码)。