【问题标题】:Play recorded audio with chronometer counter使用计时器计数器播放录制的音频
【发布时间】:2018-11-27 15:40:35
【问题描述】:

我正在创建一个带有计时器计数器的记录器应用程序,计时器在开始记录、停止记录和停止播放时工作正常。

我的问题只是开始播放,当按下开始播放按钮时,计时器从 0 开始,但是当音频文件停止时我无法停止计时器。

这是开始播放代码,请帮忙。任何帮助我都非常感谢

playAudio.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) throws IllegalArgumentException,
                SecurityException, IllegalStateException {

            stopRecord.setEnabled(false);
            startRecord.setEnabled(false);
            stopAudio.setEnabled(true);
            mediaPlayer = new MediaPlayer();
            try {
                mediaPlayer.setDataSource(AudioSavePathInDevice);
                mediaPlayer.prepare();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (!running) {
                myChronometer.setBase(SystemClock.elapsedRealtime() - pauseOffset);
                 myChronometer.start();
                running = true;

                // myChronometer.stop();
            }
            mediaPlayer.start();



            Toast.makeText(MainActivity.this, "Recording Playing",
                    Toast.LENGTH_LONG).show();
        }
    });

先生,这是停止音频的代码

stopAudio.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (running) {
                myChronometer.stop();
                myChronometer.setBase(SystemClock.elapsedRealtime());
                pauseOffset = 0;
                pauseOffset = SystemClock.elapsedRealtime() - myChronometer.getBase();
                running = false;
            }

            stopRecord.setEnabled(false);
            startRecord.setEnabled(true);
            stopAudio.setEnabled(false);
            playAudio.setEnabled(true);


            if(mediaPlayer != null){
                mediaPlayer.stop();
                mediaPlayer.release();
             //   MediaRecorderReady();

                //resetmymyChronometer
                myChronometer.setBase(SystemClock.elapsedRealtime());
                pauseOffset = 0;

            }
        }
    });

这是停止记录的代码

stopRecord.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if (running) {
                myChronometer.stop();
                myChronometer.setBase(SystemClock.elapsedRealtime());
                pauseOffset = 0;
                pauseOffset = SystemClock.elapsedRealtime() - myChronometer.getBase();
                running = false;
            }
            mediaRecorder.stop();
            stopRecord.setEnabled(false);
            playAudio.setEnabled(true);
            startRecord.setEnabled(true);
            stopAudio.setEnabled(false);

            Toast.makeText(MainActivity.this, "Recording Completed",
                    Toast.LENGTH_LONG).show();
        }
    });

MediaRecorderReady 方法

public void MediaRecorderReady(){
        //myChronometer start
        if (!running) {

            myChronometer.setBase(SystemClock.elapsedRealtime() - pauseOffset);
            myChronometer.start();
            running = true;
        //***********************

        mediaRecorder = new MediaRecorder();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        mediaRecorder.setOutputFile(AudioSavePathInDevice);

    }
}

startRecord 监听器

startRecord.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            if(checkPermission()) {

                AudioSavePathInDevice =
                        Environment.getExternalStorageDirectory().getAbsolutePath() + "/" +
                                CreateRandomAudioFileName(5) + "AudioRecording.3gp";

                MediaRecorderReady();

                try {
                    startRecord.setEnabled(true);
                    mediaRecorder.prepare();
                    mediaRecorder.start();

                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                startRecord.setEnabled(false);
                stopRecord.setEnabled(true);

                Toast.makeText(MainActivity.this, "Recording started",
                        Toast.LENGTH_LONG).show();

            } else {
                requestPermission();
            }

        }
    });

【问题讨论】:

  • 请贴出你的stopButton的onClick回调代码

标签: android android-studio jave


【解决方案1】:

可以使用 OnCompletionListener,例如:

mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
    public void onCompletion(MediaPlayer mp) {
        // your code to stop record
    }
});

更多信息: https://developer.android.com/reference/android/media/MediaPlayer.OnCompletionListener

【讨论】:

  • 请问如何使用这个监听器
  • 在播放过程中到达媒体源末尾时调用它,因此您可以在初始化 MediaPlayer 后使用它,并将停止计时的代码放入 onCompletion(MediaPlayer mp) [mp 参数:到达文件末尾的 MediaPlayer]
  • 先生,我如何显示音频文件位置以共享它?
  • 您的代码中有:AudioSavePathInDevice = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + CreateRandomAudioFileName(5) + "AudioRecording.3gp";
  • String audioSavePathInDevice = Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + CreateRandomAudioFileName(5) + "AudioRecording.3gp"; Uri uri = Uri.parse("file://" + audioSavePathInDevice );意图共享 = 新意图(意图.ACTION_SEND); share.setType("音频/*"); //或 share.setType("audio/3gp"); share.putExtra(Intent.EXTRA_STREAM, uri); startActivity(Intent.createChooser(share, "分享声音文件"));
【解决方案2】:

线

myChronometer.stop();

永远不会被调用。

在你的 playAudio 的 onClick() 方法中,你应该设置

running = true

【讨论】:

  • 这是另一个问题。
  • 不,不是,你只是检查运行值
  • 先生,我在 playAudio 中调用了 (MediaRecorderReady) 并且正在运行 = true,抱歉,我的问题中没有提及,问题已更新
  • 根据你贴的代码,playAudio的onClick中没有调用MediaRecorderReady(),只有stopAudio的
  • 再一次,如果你只点击 playAudio 按钮,你的运行标志永远不会设置为 true
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
相关资源
最近更新 更多