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

Programming Music Player A-B repeat

我正在尝试为我的媒体播放器编写 A-B 重复功能。我已经尝试过带有条件 if 语句的 Runnable 函数,当它到达 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 确保两个按钮只被按下一次。如果它们都被按下,程序会将控制传递给每 100 毫秒检查一次 getCurrentPosition() 的 Runnable 函数,如果流处于或超过停止位置(在 B 按钮方法的开头定义),它将寻求( ) A按钮方法开头定义的开始位置。然后,我设置了在多次按下任一按钮时恢复正常播放的方法。

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

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);
            }
        }
    };

希望这对遇到同样问题的人有所帮助!