尝试在setOnTouchListener上录制音频时,应用程序崩溃
问题描述:
此问题已被问到,但无法找到我的解决方案。尝试在setOnTouchListener上录制音频时,应用程序崩溃
我在做什么,MotionEvent.ACTION_DOWN
的OnTouchListener
我开始录制音频,并在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);
}
这里是我的问题,当我点击该按钮的应用程序崩溃
答
检查这个答案 Android mediarecorder stop failed 也阅读mediaRecorder及其状态的官方文档。 https://developer.android.com/reference/android/media/MediaRecorder.html 由于您停止媒体播放器和媒体播放器未处于录制状态而导致崩溃。 未处于录制状态时无法直接呼叫停止。
try {
mRecorder.stop();
}
catch(RuntimeException e) {
}
finally {
mRecorder.release();
mRecorder = null;
}
答
做像下面。
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();
}
在此处发布错误日志 – UltimateDevil
java.lang.RuntimeException:stop failed。在android.media.MediaRecorder.stop(本地方法) – manjari
请将完整的logcat和检查,当你按onclick onTouch称为ActionDown和ActionUp也被称为。 –