首页 > 解决方案 > 无法录制声音时,我的应用程序变得无响应

问题描述

我的应用程序录制声音并播放。我为录音部分实现了一个触摸按钮,为音频再现实现了一个双击按钮。到目前为止,一切都很好。

如果用户长时间触摸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)

标签: javaandroidaudio-recording

解决方案


推荐阅读