Android 第二次按下按钮时出现非法状态异常

Android 第二次按下按钮时出现非法状态异常,android,illegalstateexception,Android,Illegalstateexception,我正在制作一个简单的android应用程序。当我按下主活动中的按钮时,我调用MoveBalloon活动。此活动使用麦克风根据麦克风检测到的声音移动屏幕中的图像。我按下后退按钮,返回主活动。一切都很顺利,直到我第二次按下按钮,再次进行移动气球活动。此时应用程序崩溃。我想问题出在MoveBallon.class上,但我不知道为什么。下面我发布了logcat和MoveBalloon.class。请帮帮我!提前谢谢你! 日志: 09-24 14:52:20.346: E/AndroidRuntime(2

我正在制作一个简单的android应用程序。当我按下主活动中的按钮时,我调用MoveBalloon活动。此活动使用麦克风根据麦克风检测到的声音移动屏幕中的图像。我按下后退按钮,返回主活动。一切都很顺利,直到我第二次按下按钮,再次进行移动气球活动。此时应用程序崩溃。我想问题出在MoveBallon.class上,但我不知道为什么。下面我发布了logcat和MoveBalloon.class。请帮帮我!提前谢谢你! 日志:

09-24 14:52:20.346: E/AndroidRuntime(23075): FATAL EXCEPTION: main
09-24 14:52:20.346: E/AndroidRuntime(23075): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.prova1/com.example.prova1.MoveBalloon}: java.lang.IllegalStateException
09-24 14:52:20.346: E/AndroidRuntime(23075):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at android.os.Looper.loop(Looper.java:137)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at android.app.ActivityThread.main(ActivityThread.java:5103)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at java.lang.reflect.Method.invokeNative(Native Method)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at java.lang.reflect.Method.invoke(Method.java:525)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at dalvik.system.NativeStart.main(Native Method)
09-24 14:52:20.346: E/AndroidRuntime(23075): Caused by: java.lang.IllegalStateException
09-24 14:52:20.346: E/AndroidRuntime(23075):    at android.media.MediaRecorder.start(Native Method)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at com.example.prova1.Microphone.<init>(Microphone.java:29)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at com.example.prova1.MoveBalloon.onCreate(MoveBalloon.java:106)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at android.app.Activity.performCreate(Activity.java:5133)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
09-24 14:52:20.346: E/AndroidRuntime(23075):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
09-24 14:52:20.346: E/AndroidRuntime(23075):    ... 11 more
新日志:

09-24 16:31:44.140: E/AndroidRuntime(31331): FATAL EXCEPTION: Thread-1680
09-24 16:31:44.140: E/AndroidRuntime(31331): java.lang.NullPointerException
09-24 16:31:44.140: E/AndroidRuntime(31331):    at com.example.prova1.Microphone.getLevel(Microphone.java:43)
09-24 16:31:44.140: E/AndroidRuntime(31331):    at com.example.prova1.Microphone.getAmplitudeEMA(Microphone.java:48)
09-24 16:31:44.140: E/AndroidRuntime(31331):    at com.example.prova1.MoveBalloon.updateMic(MoveBalloon.java:157)
09-24 16:31:44.140: E/AndroidRuntime(31331):    at com.example.prova1.MoveBalloon$DrawBalloon.run(MoveBalloon.java:84)

我不确定麦克风是从哪里来的。你能提供更多关于这个课程的信息吗

但问题似乎是在麦克风类内部初始化MediaRecorder时,麦克风已在录制

在这里,您可以看到如何使用MediaRecorder正确处理音频录制:

有关实时音频处理,请参阅

通常,当按下“后退”按钮时,您必须停止并释放媒体录制器。这允许您稍后初始化记录器而不会出错


希望这会有所帮助。

micromic.class中的第29行是:recorder.start();MoveBalloon.class中的行号106是:mic=new microsic();我在教室里贴了麦克风。非常感谢。尝试在MoveBallon.onBackPressed()方法中调用mic.stopMic()。还有recorder.stop(),在这个方法中我试过了。但现在当我按下后退按钮时,应用程序崩溃了。日志猫是:09-24 16:31:44.140:E/AndroidRuntime(31331):致命异常:Thread-1680 09-24 16:31:44.140:E/AndroidRuntime(31331):java.lang.nullpointer异常09-24 16:31:44.140:E/AndroidRuntime(31331):在com.example.prova1.micro.getLevel(micro.java:43)09-24 16:31:44.140:E/AndroidRuntime(31331):在com.example.prova1.micromic.getAmplitudeEMA(micromic.java:48)09-24 16:31:44.140:E/AndroidRuntime(31331):在com.example.prova1.MoveBalloon.updateMic(MoveBalloon.java:157)我再次发布了日志。
package com.example.prova1;
import java.io.IOException;

import android.media.MediaRecorder;

public class Microphone {
    MediaRecorder recorder;
    int level;
    static final private double EMA_FILTER = 0.6;
    private double mEMA = 0;

    public Microphone(){
        // Audio recorder
        recorder = new MediaRecorder();
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        recorder.setOutputFile("/dev/null");
        mEMA = 0;
       try {
            recorder.prepare();
               recorder.start();

       }
          catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void stopMic(){

                recorder.release();


}
    public double getLevel(){
        level = recorder.getMaxAmplitude();
        level = level/2700;
        return level;
    }
    public double getAmplitudeEMA() {
        double amp = getLevel();
        mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA;
        return mEMA;
}

}
09-24 16:31:44.140: E/AndroidRuntime(31331): FATAL EXCEPTION: Thread-1680
09-24 16:31:44.140: E/AndroidRuntime(31331): java.lang.NullPointerException
09-24 16:31:44.140: E/AndroidRuntime(31331):    at com.example.prova1.Microphone.getLevel(Microphone.java:43)
09-24 16:31:44.140: E/AndroidRuntime(31331):    at com.example.prova1.Microphone.getAmplitudeEMA(Microphone.java:48)
09-24 16:31:44.140: E/AndroidRuntime(31331):    at com.example.prova1.MoveBalloon.updateMic(MoveBalloon.java:157)
09-24 16:31:44.140: E/AndroidRuntime(31331):    at com.example.prova1.MoveBalloon$DrawBalloon.run(MoveBalloon.java:84)