在android应用程序中录制音频时如何解决java.lang.IllegalStateException
我正在创建一个应用程序来录制音频。 我创建了一个名为“Record”的片段,其中包含一个录制音频的按钮。 这是片段的代码在android应用程序中录制音频时如何解决java.lang.IllegalStateException,java,android,android-fragments,Java,Android,Android Fragments,我正在创建一个应用程序来录制音频。 我创建了一个名为“Record”的片段,其中包含一个录制音频的按钮。 这是片段的代码 public class Record extends Fragment { private Button ButtonRecord; private MediaRecorder recorder; private String fileName = null; private static final String LOG_TAG = "Record_Log"; pri
public class Record extends Fragment {
private Button ButtonRecord;
private MediaRecorder recorder;
private String fileName = null;
private static final String LOG_TAG = "Record_Log";
private int ClickCount = 0;
private StorageReference Storage;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_record,container,false);
ButtonRecord = v.findViewById(R.id.button_record_record);
fileName = Environment.getExternalStorageDirectory().getAbsolutePath();
fileName = "/audio.3gp";
Storage = FirebaseStorage.getInstance().getReference();
ButtonRecord.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ClickCount++;
if(ClickCount%2 == 1) {
startRecording();
ButtonRecord.setText("Stop");
}
else if(ClickCount%2 == 0) {
stopRecording();
ButtonRecord.setText("Record");
}
}
});
return v;
}
这是启动-停止记录器的代码
private void startRecording() {
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setOutputFile(fileName);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
recorder.prepare();
} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}
recorder.start();
}
private void stopRecording() {
recorder.stop();
recorder.release();
recorder = null;
}
当我尝试按下录制按钮时,应用程序崩溃,并显示以下错误。错误将显示在弹出窗口中
java.lang.IllegalStateException
at android.media.MediaRecorder.start(Native Method)
at com.example.afinal.Record.startRecording(Record.java:68)
at com.example.afinal.Record.access$100(Record.java:19)
at com.example.afinal.Record$1.onClick(Record.java:42)
at android.view.View.performClick(View.java:6304)
at android.view.View$PerformClick.run(View.java:24803)
at android.os.Handler.handleCallback(Handler.java:794)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:6651)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)
谢谢大家的回答。事实上我知道问题出在哪里了。我给fileName赋值两次。我将它与a+组合在一起,它成功了。不要忽略异常。为了调用
start()
,记录器必须处于“准备”状态,这是通过成功调用prepare()
建立的,但是prepare()
可能失败(请参阅日志),代码忽略了异常(在记录它之后),因此代码无论如何都试图start()
,导致了该错误。--简而言之:如果prepare()
失败,不要调用start()
。Andreas是正确的:您应该在成功完成prepare()
后,在try/catch块内调用start()
。另外:请看这里: