【问题标题】:App is crashing when trying to record audio on setOnTouchListener尝试在 setOnTouchListener 上录制音频时应用程序崩溃
【发布时间】:2017-10-06 05:20:05
【问题描述】:

这个问题已经被问过了,但我无法找到我的解决方案。

我正在做的是,OnTouchListener 中的MotionEvent.ACTION_DOWN 我开始录制音频,在MotionEvent.ACTION_UP 我停止了音频录制。

在长时间触摸该图标时,它工作正常,但onclick 应用程序崩溃了。 这是我的

audio.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            Toast.makeText(Chat.this, "You Have to hold the Button for audio recording.", Toast.LENGTH_LONG).show();
        }
    });

audio.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                MediaRecorderReady();
                try {
                    mediaRecorder.prepare();
                    mediaRecorder.start();
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                if (mediaRecorder != null) {
                    mediaRecorder.stop();
                }
            }
            return true;
        }
    });

 public void MediaRecorderReady() {
    mediaRecorder = new MediaRecorder();
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
    mediaRecorder.setOutputFile(AudioSavePathInDevice);
}

这是我的问题,当我单击该按钮时,应用程序崩溃了

【问题讨论】:

  • 在此处发布您的错误日志
  • java.lang.RuntimeException: 停止失败。在 android.media.MediaRecorder.stop(本机方法)
  • 请输入完整的 logcat 并检查当你按下 onclick 时 onTouch 是否被调用 ActionDown 并且 ActionUp 也被调用。
  • 是的,这就是它崩溃的原因,但是如何解决这个问题
  • 我已经发布了解决这个问题的答案。

标签: android onclicklistener ontouchlistener touch-event android-audiorecord


【解决方案1】:

检查这个答案 Android mediarecorder stop failed 并阅读有关 mediaRecorder 及其状态的官方文档。 https://developer.android.com/reference/android/media/MediaRecorder.html 崩溃是因为您停止了媒体播放器并且媒体播放器未处于录制状态.. 非录音状态时不要直接调用stop。

try {
     mRecorder.stop();
    } 
     catch(RuntimeException e) {
     } 
      finally {
               mRecorder.release();
               mRecorder = null;
     }

【讨论】:

  • 谢谢。这个 try catch 块解决了崩溃的应用程序。
  • 你能告诉我如何在我点击按钮时显示祝酒词,并且音频会在按下很长时间时录制吗?
【解决方案2】:

如下所示。

private MediaRecorder myAudioRecorder;
    private MediaPlayer mPlayer;

audio.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                initializeRecorder();                  
                recordFile(); 

            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                stopRecording();
            }
            return true;
        }
    });

private void initializeRecorder() {
        File cacheDir = new File(Utils.SD_CARD, Utils.RECORDING_CACHE);
        if (!(cacheDir.exists())) {
            cacheDir.mkdirs();
        }

        outputFile = cacheDir + "/" + String.format("%s.m4a", System.currentTimeMillis());

        mPlayer = new MediaPlayer();
        myAudioRecorder = new MediaRecorder();
        myAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);

        //original
        myAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        myAudioRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        myAudioRecorder.setOutputFile(outputFile);

    }

private void recordFile() {
        try {
            myAudioRecorder.prepare();
            myAudioRecorder.start();
        } catch (IOException e) {
            e.printStackTrace();
        }  
    }

private void stopRecording(){
     myAudioRecorder.stop();
     myAudioRecorder.release();
}

【讨论】:

  • 我的代码在我长时间触摸然后删除时工作正常
  • 那是什么问题?
  • 当我只是触摸音频按钮然后应用程序崩溃。长按并释放音频记录良好
猜你喜欢
  • 1970-01-01
  • 2020-01-26
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
相关资源
最近更新 更多