当前位置: 首页 > 知识库问答 >
问题:

媒体播放器-暂停第二个音频引发异常

洪飞白
2023-03-14

我正在使用沙漏库进行倒计时。假设5分钟。在这段时间里,我反复播放同样的5个音频文件。这很有效。问题在于暂停。当它打开第一个音频时。它暂停并恢复得很好。当它进入下一首歌,我暂停后,它抛出了一个非法状态例外。

代码有点难看。在onCompletion中,它会一直播放文件,直到结束。然后调用playAudio(),循环开始,直到小时刻度达到零。

pause.setOnClickListener(新视图。OnClickListener()是一个浮动操作按钮,我可以在暂停图标和播放图标之间切换

Java类代码

    tracks[0] = R.raw.audio0;
    tracks[1] = R.raw.audio1;
    tracks[2] = R.raw.audio2;
    tracks[3] = R.raw.audio3;
    tracks[4] = R.raw.audio4;

    countDown = (TextView) findViewById(R.id.txtCountdown);
    cancel = (FloatingActionButton)findViewById(R.id.cancelMeditation);
    pause = (FloatingActionButton)findViewById(R.id.pauseMeditation);

    Intent intent = getIntent();
    check = intent.getIntExtra("DURATION", -1);
    milliseconds = check * 60000;



    countDown.setText("" + String.format("%d min",
            TimeUnit.MILLISECONDS.toMinutes(milliseconds)));


    pause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(hourglass == null){
                startTimer(milliseconds);
                currentTrack = 0;
                isTimerDone = false;
                playAudio();
                pause.setImageResource(R.drawable.ic_pause);
                return;
            }
            if(hourglass.isPaused()){
                hourglass.resumeTimer();
                pause.setImageResource(R.drawable.ic_pause);
                isPaused = false;
                mediaAffyPlayer.seekTo(length);
                mediaAffyPlayer.start();

            }else if(hourglass.isRunning()){
                hourglass.pauseTimer();
                pause.setImageResource(R.drawable.ic_play1);
                isPaused = true;
                if(mediaAffyPlayer != null) {
                    mediaAffyPlayer.pause();
                    length = mediaAffyPlayer.getCurrentPosition();
                }

            } else{
                startTimer(milliseconds);
                playAudio();
            }

        }
    });


    cancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });

}


public void startTimer(long milliseconds){
    hourglass = new Hourglass(milliseconds, 1000) {
        @Override
        public void onTimerTick(long timeRemaining) {

            countDown.setText("" + String.format("%d min, %d sec",
                    TimeUnit.MILLISECONDS.toMinutes(timeRemaining),
                    TimeUnit.MILLISECONDS.toSeconds(timeRemaining) -
                            TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(timeRemaining))));
            if(TimeUnit.MILLISECONDS.toMinutes(timeRemaining) ==0){
                return;
            }
        }

        @Override
        public void onTimerFinish() {
            isTimerDone = true;
        }
    };

    hourglass.startTimer();

}


private void playAudio(){

    if(mediaAffyPlayer == null){
        mediaAffyPlayer = MediaPlayer.create(getApplicationContext(), tracks[0]);
        mediaAffyPlayer.setOnCompletionListener(this);
        mediaAffyPlayer.start();
        isPaused = false;
        return;
    }
    if(mediaAffyPlayer != null) {
        mediaAffyPlayer.release();
        mediaAffyPlayer = MediaPlayer.create(getApplicationContext(), tracks[0]);
        mediaAffyPlayer.setOnCompletionListener(this);
        isPaused = false;
        mediaAffyPlayer.start();
    }


    mediaAffyPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
        public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
            return false;
        }
    });
}


public void onCompletion(MediaPlayer mediaPlayer) {


    if (currentTrack < tracks.length - 1) {

        if(isTimerDone){
            countDown.setText("" + String.format("%d min",
                    TimeUnit.MILLISECONDS.toMinutes(milliseconds)));
            pause.setImageResource(R.drawable.ic_play1);
            mediaPlayer.reset();
            mediaPlayer.release();
            mediaPlayer=null;
            hourglass = null;
            return;
        }

        currentTrack++;
        mediaPlayer.release();
        mediaPlayer = MediaPlayer.create(getApplicationContext(), tracks[currentTrack]);
        mediaPlayer.setOnCompletionListener(ShowMeditationActivity.this);
        mediaPlayer.start();

    } else {
        if(!isTimerDone){
            currentTrack = 0;
            playAudio();
        }
    }
}

例外

 java.lang.IllegalStateException
 at android.media.MediaPlayer._pause(Native Method)
 at android.media.MediaPlayer.pause(MediaPlayer.java:1512)

将其抛向mediaAffyPlayer.pause();在hourglass.is运行()

我知道代码很难看,但我只是认为当它播放第二首曲目时,媒体播放器对象发生了变化,这就是它抛出错误的原因。我就是不知道怎么修。

非常感谢您的帮助,因为我已经花了很多时间试图修复它。谢谢

编辑我修复了这个问题。

我在OnCompletion中注释掉了创建和播放mediaplayer的代码。我调用playAudio()并将代码插入其中。

     private void playAudio(){

    if(mediaAffyPlayer == null){
        mediaAffyPlayer = MediaPlayer.create(getApplicationContext(), tracks[0]);
        mediaAffyPlayer.setOnCompletionListener(this);
        mediaAffyPlayer.start();
        isPaused = false;
        return;
    }
    if(mediaAffyPlayer != null) {
        currentTrack++;
        mediaAffyPlayer.release();
        mediaAffyPlayer = MediaPlayer.create(getApplicationContext(), tracks[currentTrack]);
        mediaAffyPlayer.setOnCompletionListener(ShowMeditationActivity.this);
        mediaAffyPlayer.start();

    }

共有1个答案

刘弘新
2023-03-14

isPaused()出现问题

试试这个!!

 try{
    if (mediaAffyPlayer.isPlaying()) {
      mediaAffyPlayer.pause();
}
}catch(Exception we){
    we.printStackTrace();
}
 类似资料:
  • 我正在开发一个包含一些音频播放器的RecyclerView的应用程序。应用程序将下载。3gp文件(如果尚未下载)。 当我单击playAudio按钮时,音频未被播放。 这是我的适配器代码: 我怎样才能解决这个问题?

  • 问题内容: 我的键盘包含用于执行各种非标准键盘任务的一行按钮。这些键包含诸如修改音量,播放或暂停以及跳过曲目等功能。如何使用Python模拟基本播放/暂停?顺便说一下,我在Windows上。 问题答案: 我会用pywin32。与安装捆绑在一起的是大量的API文档(通常放在。),它实际上包装了Win32库中的许多内容,该库用于Windows中的许多低级任务。 安装后,您可以使用keybd_event

  • 我正在开发一个音频播放器,它可以在后台播放音频文件。我的问题是,当录像机或视频播放器启动时,我需要暂停音频播放器。 有什么方法可以处理这个任务吗?例如,我有来处理这些调用。当我接到呼叫或wnat呼叫时,我们可以使用呼叫状态暂停播放器。我想为录像机或视频播放器以及相同的场景。当视频/录制开始时,我需要暂停音频播放器。

  • 函数名称:暂停音频播放 函数功能: 暂停音频播放 函数方法 media.pause() 函数用例 media.playAudio("/mnt/sdcard/LuaBox/Projects/1/1.mp3",5,true) --把音乐播放到 1 分钟的位置 media.jump(60*1000) mSleep(2000) -- 暂停音频播放 media.pause() 注意事项 目前积木编程函数和

  • 大家好,我正在尝试使用两个独立的媒体播放器实例播放音频和视频文件。当我从一开始播放它时,它工作得很好。但当我寻找时,我可以看到音频和视频的延迟 这是我寻找音频和视频的代码 //sikAudio(msec); if(media播放器!=null) { // 没有直播流,如果(medialayer.get持续时间() }

  • 我正在使用Android Media Player从我的服务器播放音乐。可以使用MediaPlayer将播放音频保存到存储吗?