java - 无法录制声音时,我的应用程序变得无响应
问题描述
我的应用程序录制声音并播放。我为录音部分实现了一个触摸按钮,为音频再现实现了一个双击按钮。到目前为止,一切都很好。
如果用户长时间触摸recordBtn(几秒钟),MediaPlayer 会成功录制音频,并且 playBtn 将在单击时开始再现音频,而在第二次单击时它将停止播放(除非剪辑完成并且它将通过现有的 onCompletionListener 自行恢复到其原始状态)。
现在问题来了:
如果用户单击触摸按钮 (recordBtn) 而不是长时间触摸(至少大约 2 秒),则 MediaRecorder 将无法记录,(这通常会使应用程序崩溃,但不会由于已到位的 IOException )。
MediaRecorder 现在为空,如果用户尝试通过 playBtn 播放音频,那么整个应用程序将变得无响应,直到用户再次单击 playBtn。
这是代码:
即使应用程序在运行时访问 if 语句的内容,我也尝试使用 if 语句检查“if(mPlayer != null){ ...”,这就像完全忽略“else if”场景一样。
//Play button actions
playBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isPlaying) {
mPlayer.release();
mPlayer = null;
playBtn.setEnabled(true);
recordBtn.setEnabled(true);
isPlaying = false;
} else {
recordBtn.setEnabled(false);
playBtn.setEnabled(true);
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(mFileName);
if(mPlayer != null) {
mPlayer.prepare();
mPlayer.start();
mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
isPlaying = false;
playBtn.setEnabled(true);
recordBtn.setEnabled(true);
}
});
}else if (mPlayer == null){
isPlaying = false;
mPlayer.release();
playBtn.setEnabled(true);
recordBtn.setEnabled(true);
}
} catch (IOException e) {
e.printStackTrace();
}
isPlaying = true;
}
}
});
//record button actions
recordBtn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
if(isRecording) {
playBtn.setEnabled(true);
stopRecording();
isRecording = false;
}
}
else if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
if(!isRecording) {
playBtn.setEnabled(false);
startRecording();
isRecording = true;
}
}
return false;
}
});
private void startRecording() {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mRecorder.setOutputFile(mFileName);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
try {
mRecorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mRecorder.start();
}
private void stopRecording() {
try {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
} catch(Exception e) {
e.printStackTrace();
}
}
logcat 在单击 playBtn 并且应用程序变得无响应时拍摄:
第 131 行是“mPlayer.prepare();”
2019-05-24 17:16:10.035 13373-13373/tk.gandriks.gaaudiotransform D/ViewRootImpl@ed74148[MainActivity]: ViewPostIme pointer 0
2019-05-24 17:16:10.092 13373-13373/tk.gandriks.gaaudiotransform D/ViewRootImpl@ed74148[MainActivity]: ViewPostIme pointer 1
2019-05-24 17:16:10.105 13373-13373/tk.gandriks.gaaudiotransform I/MediaPlayer: Need to enable context aware info
2019-05-24 17:16:10.105 13373-13373/tk.gandriks.gaaudiotransform V/MediaPlayer-JNI: native_setup
2019-05-24 17:16:10.105 13373-13373/tk.gandriks.gaaudiotransform V/MediaPlayerNative: constructor
2019-05-24 17:16:10.110 13373-13373/tk.gandriks.gaaudiotransform V/MediaPlayerNative: setListener
2019-05-24 17:16:10.115 13373-13373/tk.gandriks.gaaudiotransform V/MediaPlayer-JNI: setDataSourceFD: fd 89
2019-05-24 17:16:10.115 13373-13373/tk.gandriks.gaaudiotransform V/MediaPlayerNative: setDataSource(89, 0, 576460752303423487)
2019-05-24 17:16:10.121 13373-13373/tk.gandriks.gaaudiotransform V/MediaPlayerNative: setVideoSurfaceTexture
2019-05-24 17:16:10.122 13373-13373/tk.gandriks.gaaudiotransform V/MediaPlayerNative: prepare
2019-05-24 17:16:10.134 13373-13442/tk.gandriks.gaaudiotransform V/MediaPlayerNative: message received msg=300, ext1=0, ext2=0
2019-05-24 17:16:10.134 13373-13442/tk.gandriks.gaaudiotransform V/MediaPlayerNative: Received SEC_MM_PLAYER_CONTEXT_AWARE
2019-05-24 17:16:10.134 13373-13442/tk.gandriks.gaaudiotransform V/MediaPlayerNative: callback application
2019-05-24 17:16:10.134 13373-13442/tk.gandriks.gaaudiotransform V/MediaPlayerNative: back from callback
2019-05-24 17:16:10.135 13373-13442/tk.gandriks.gaaudiotransform V/MediaPlayerNative: message received msg=100, ext1=1, ext2=-2147483648
2019-05-24 17:16:10.135 13373-13442/tk.gandriks.gaaudiotransform E/MediaPlayerNative: error (1, -2147483648)
2019-05-24 17:16:10.135 13373-13442/tk.gandriks.gaaudiotransform V/MediaPlayerNative: signal application thread
2019-05-24 17:16:10.135 13373-13373/tk.gandriks.gaaudiotransform V/MediaPlayerNative: prepare complete - status=1
2019-05-24 17:16:10.135 13373-13373/tk.gandriks.gaaudiotransform W/System.err: java.io.IOException: Prepare failed.: status=0x1
2019-05-24 17:16:10.136 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at android.media.MediaPlayer._prepare(Native Method)
2019-05-24 17:16:10.136 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at android.media.MediaPlayer.prepare(MediaPlayer.java:1441)
2019-05-24 17:16:10.136 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at tk.gandriks.gaaudiotransform.MainActivity$2.onClick(MainActivity.java:131)
2019-05-24 17:16:10.136 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at android.view.View.performClick(View.java:6897)
2019-05-24 17:16:10.136 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at android.widget.TextView.performClick(TextView.java:12693)
2019-05-24 17:16:10.136 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at android.view.View$PerformClick.run(View.java:26101)
2019-05-24 17:16:10.136 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at android.os.Handler.handleCallback(Handler.java:789)
2019-05-24 17:16:10.137 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at android.os.Handler.dispatchMessage(Handler.java:98)
2019-05-24 17:16:10.137 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at android.os.Looper.loop(Looper.java:164)
2019-05-24 17:16:10.137 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6944)
2019-05-24 17:16:10.137 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2019-05-24 17:16:10.137 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
2019-05-24 17:16:10.137 13373-13373/tk.gandriks.gaaudiotransform W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
解决方案
推荐阅读
- azure-iot-edge - 无法在 redhat 上安装 Azure IoT Edge RC4
- python - 从另一个函数结束函数 Tkinter 窗口
- kubernetes - Kubernetes HPA pod 自定义指标显示为
- microsoft-teams - MS Teams SIP 网关 - 预览程序或规范?
- apache-kafka - 如何输出kafka客户端模块的调试信息
- python - 随机更改python列表中的字符
- python - 在 tkinter 中创建消息框时禁用窗口控件
- python-3.x - 通过锁定文件来同步同一 python 脚本的 2 个实例
- javascript - 使用 react.js 在社交网络上分享图像
- reactjs - 尝试使用 react-admin 转换功能