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