【问题标题】:How to solve java.lang.IllegalStateException while recording audio in android app在android应用程序中录制音频时如何解决java.lang.IllegalStateException
【发布时间】:2020-05-21 01:44:02
【问题描述】:

我正在创建一个应用来录制音频。 我创建了一个名为“记录”的片段,其中包含一个用于录制音频的按钮。 这是片段的代码

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)   

【问题讨论】:

  • 不要忽略异常。为了调用start(),记录器必须处于“准备”状态,该状态由成功建立i> 调用prepare(),但prepare() 可能失败(请参阅您的日志),代码忽略了异常(在记录后),因此代码无论如何都尝试start(),导致该错误。 --- 简而言之:如果prepare() 失败,请不要调用start()
  • Andreas 是正确的:你应该调用start() INSIDE try/catch 块,AFTER 你已经成功完成了prepare()。另外:看这里:Why does the start() method of MediaRecorder throw an IllegalStateException?

标签: java android android-fragments


【解决方案1】:

谢谢大家的回答。我实际上发现了问题所在。我两次为 fileName 分配了一些值。我将它与 + 组合在一起,它起作用了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多