Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编程音乐播放器A-B重复_Java_Android_Media Player_Runnable_Repeat - Fatal编程技术网

Java 编程音乐播放器A-B重复

Java 编程音乐播放器A-B重复,java,android,media-player,runnable,repeat,Java,Android,Media Player,Runnable,Repeat,我正在尝试为我的媒体播放器编写一个A-B重复函数。我已经尝试过一个带有条件if语句的可运行函数,当它到达B标记时,它将通过使用mediaplayer.getCurrentPosition函数保存音频流中的位置返回开始标记。我还尝试了一个while循环,该循环在应用程序冻结时也产生了不满意的结果。下面是我为这样一个方法编写的当前代码 public void aButton() { start = mediaPlayer.getCurrentPosition(); }

我正在尝试为我的媒体播放器编写一个A-B重复函数。我已经尝试过一个带有条件if语句的可运行函数,当它到达B标记时,它将通过使用mediaplayer.getCurrentPosition函数保存音频流中的位置返回开始标记。我还尝试了一个while循环,该循环在应用程序冻结时也产生了不满意的结果。下面是我为这样一个方法编写的当前代码

public void aButton() {
        start = mediaPlayer.getCurrentPosition();
    }

    public void bButton() {
        pressedCount += 1;
        System.out.println("AB Button Count: " + pressedCount);
        stop = mediaPlayer.getCurrentPosition();
        mediaPlayer.seekTo(start);
        if(mediaPlayer.getCurrentPosition() == stop){
            mediaPlayer.seekTo(start);
        }
    }

我最终解决了自己的问题,我决定在程序中编写一个带有处理程序的可运行函数,以适应while循环,而不必进行异常处理。我为音频流中的a和b拼接位置设置计数器。我使用计数器aCount+=1确保两个按钮只按下一次;和bCount+=1。如果两者都被按下,程序将把控制权传递给Runnable函数,该函数每100毫秒检查一次getCurrentPosition,如果流处于或超过在B按钮方法开始时定义的停止位置,它将查找到在按钮方法开始时定义的开始位置。然后我设置了恢复正常播放的方法,如果其中一个按钮被按下不止一次

下面是显示我对代码所做更改的代码:

public void aButton() {
        start = mediaPlayer.getCurrentPosition();

        if (aCount > 1 && bCount == 1) {
            aCount = 0;
            bCount = 0;
        }
        aCount += 1;

    }

    public void bButton() {
        stop = mediaPlayer.getCurrentPosition();

        if (bCount > 1 && aCount >= 1) {
            bCount = 0;
            aCount = 0;
        }

        if (aCount != 1) {
            Toast.makeText(this, "Please press A first", Toast.LENGTH_SHORT).show();
            bCount = 0;
        }
        if(bCount == 0 && aCount == 1){
            bCount += 1;
        }

        System.out.println("AB Button Count: " + bCount);
        /*mediaPlayer.seekTo(start);*/
        abLoopHandler.removeCallbacks(abLoop);
        abLoopHandler.postDelayed(abLoop, 100);
    }

    private Runnable abLoop = new Runnable() {
        @Override
        public void run() {
            if (aCount == 1 && bCount == 1) {
                int currPos = mediaPlayer.getCurrentPosition();
                if (currPos >= stop) {
                    mediaPlayer.seekTo(start);
                }
                abLoopHandler.postDelayed(this, 100);
            }
        }
    };

希望这能帮助人们解决同样的问题

你想在a的声音到达B时重复a的声音吗?是的。然后,当我按下a或b按钮时,我希望它清除停止和开始位置,并从音频流中的当前位置恢复播放。