【问题标题】:Audio Recording in Background throws IllegalStateException when I try to stop it当我尝试停止录音时,后台的录音会引发 IllegalStateException
【发布时间】:2019-03-10 04:45:00
【问题描述】:

我正在使用Service 类创建一个后台录音机。当我开始录制时它工作正常,但当我停止它时,它会在 onStop() 上抛出 IllegalStateException

这是我的服务类代码:

public class AudioRecorderService extends Service {

    MediaRecorder mAudioRecorder;
    String fileName = null;

    public AudioRecorderService() {
    }

    @Override
    public void onCreate() {

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

       setupRecorder();
       Toast.makeText(this, "Recording Started", Toast.LENGTH_LONG).show();


        return START_STICKY;
    }


    private void setupRecorder(){

        fileName = Environment.getDataDirectory().getAbsolutePath() + "/" + "test.mp4";

        mAudioRecorder = new MediaRecorder();
        mAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        mAudioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        mAudioRecorder.setAudioEncodingBitRate(256);
        mAudioRecorder.setAudioChannels(1);
        mAudioRecorder.setAudioSamplingRate(44100);
        mAudioRecorder.setOutputFile(fileName);

        try {
            mAudioRecorder.prepare();
            mAudioRecorder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    @Override
    public void onDestroy() {

        if (mAudioRecorder != null) {
            mAudioRecorder.stop();
            mAudioRecorder.reset();
            mAudioRecorder.release();
        }
        Toast.makeText(this, "Recording Done", Toast.LENGTH_LONG).show();
    }


}

我无法弄清楚代码有什么问题。请问谁能帮忙???

【问题讨论】:

  • 您的代码看起来不错,可以发布 logcat 吗?
  • 现在,当我尝试执行 AudioRecorder Service 类时,我的应用程序一次又一次地获得 ANR。我想有一些线程问题。

标签: android audiorecord


【解决方案1】:

启动和停止时应按此顺序。如有任何错误通知是必要的

MediaRecorder recorder = null;

private void startRecording(File file) {
   if (recorder != null) {
      recorder.release();
   }
   recorder = new MediaRecorder();
   recorder.setAudioSource(AudioSource.MIC);
   recorder.setOutputFormat(OutputFormat.THREE_GPP);
   recorder.setAudioEncoder(AudioEncoder.AMR_WB);
   recorder.setOutputFile(file.getAbsolutePath());
   try {
      recorder.prepare();
      recorder.start();
   } catch (IOException e) {
      Log.e("Error", "io problems while preparing [" +
            file.getAbsolutePath() + "]: " + e.getMessage());
   }
}

现在java.lang.IllegalStateException
当您不遵循上述顺序、错过一些重要步骤或prepare() 失败但您仍然继续时会发生这种情况。后者是最容易出错的地方。只有当prepare() 无异常退出时,您才应该调用start()。否则你会得到一个IllegalStateException。由于它是RuntimeException,您可能无法捕捉到它,您的应用程序将强制关闭。

停止时遵循此顺序

private void stopRecording() {
   if (recorder != null) {
      recorder.stop();
      recorder.release();
      recorder = null;
   }
}

最后但不是 Manifest 中的租约,权限

<uses-permission
      android:name="android.permission.RECORD_AUDIO" />

【讨论】:

    【解决方案2】:

    由于mAudioRecorder.reset();,您遇到了错误

     @Override
        public void onDestroy() {
    
            if (mAudioRecorder != null) {
                mAudioRecorder.stop();
                // here is error
                mAudioRecorder.reset();
                mAudioRecorder.release();
            }
            Toast.makeText(this, "Recording Done", Toast.LENGTH_LONG).show();
        }
    

    更新它。

     @Override
        public void onDestroy() {
    
            if (mAudioRecorder != null) {
                mAudioRecorder.stop();
                mAudioRecorder.release();
            }
            Toast.makeText(this, "Recording Done", Toast.LENGTH_LONG).show();
        }
    

    参考官网:https://developer.android.com/guide/topics/media/audio-capture.html

    【讨论】:

    • 你怎么能说mAudioRecorder.reset();是错误的原因?
    【解决方案3】:

    我已经在 AndroidManifest.xml 上添加了这两个权限,它不会再崩溃了。 P/S:应用启动时会询问您是否允许录制音频。

    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    

    【讨论】:

      猜你喜欢
      • 2012-12-24
      • 2013-04-18
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 2012-09-14
      • 2023-03-24
      • 1970-01-01
      相关资源
      最近更新 更多