Java setNextMediaPlayer()在android 5.1.1中循环有间隙的音频

Java setNextMediaPlayer()在android 5.1.1中循环有间隙的音频,java,android,android-mediaplayer,Java,Android,Android Mediaplayer,在我的应用程序中,我需要播放多个mediaplayer,并在没有间隙的情况下循环播放,我尝试创建一个新类,为每个声音创建两个播放器(currentPlayer和nextPlayer),并将nextPlayer设置为currentPlayer的下一个mediaplayer,如本主题第一个答案中所述 我已经在很多设备上试用过该应用程序,除了运行安卓5.1.1的三星设备外,其他一切都正常,该设备仍在与MediaPlayer进行循环 以下是我对LoopMediaPlayer类的实现: package

在我的应用程序中,我需要播放多个mediaplayer,并在没有间隙的情况下循环播放,我尝试创建一个新类,为每个声音创建两个播放器(currentPlayer和nextPlayer),并将nextPlayer设置为currentPlayer的下一个mediaplayer,如本主题第一个答案中所述

我已经在很多设备上试用过该应用程序,除了运行安卓5.1.1的三星设备外,其他一切都正常,该设备仍在与MediaPlayer进行循环

以下是我对LoopMediaPlayer类的实现:

package com.example.naturesounds;

import android.content.Context;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.PowerManager;
import android.util.Log;
import java.io.IOException;
import java.util.HashMap;

public class LoopMediaPlayer {

public  final String TAG = LoopMediaPlayer.class.getSimpleName();

private Context context = null;

private String resourceName = "";

private int counter = 1;

private  float nextPlayerVolume = 0;

private MediaPlayer currentPlayer = null;

private MediaPlayer nextPlayer = null;

public static LoopMediaPlayer create(Context context,String resourceName) {

    return new LoopMediaPlayer(context, resourceName);
}

public  LoopMediaPlayer(Context context, String resourceName) {

    this.context = context;

    this.resourceName = resourceName;

    currentPlayer = new MediaPlayer();

    try {
        currentPlayer.setDataSource(context, Uri.parse("android.resource://com.example.naturesounds/raw/"

                + resourceName));

        currentPlayer.prepare();

        currentPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {

                currentPlayer.start();
            }
        });
    }
    catch (IOException e1)
    {
        e1.printStackTrace();
    }
    catch (IllegalArgumentException e2)
    {
        e2.printStackTrace();
    }

    createNextMediaPlayer();
}

void createNextMediaPlayer() {

    nextPlayer = new MediaPlayer();

    try {
        nextPlayer.setDataSource(context, Uri.parse("android.resource://com.example.naturesounds/raw/"

                + resourceName));

        nextPlayer.prepare();
    }
    catch (IOException e1)
    {
        e1.printStackTrace();
    }
    catch (IllegalArgumentException e2)
    {
        e2.printStackTrace();
    }

   currentPlayer.setNextMediaPlayer(nextPlayer);

   currentPlayer.setOnCompletionListener(onCompletionListener);
}

private MediaPlayer.OnCompletionListener onCompletionListener = new MediaPlayer.OnCompletionListener() {

    @Override
    public void onCompletion(MediaPlayer mp) {

        if(Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP)
        {
            mp.setLooping(true);
        }

        else
        {
            mp.release();

            nextPlayerVolume = getNextPlayerVolume();

            Log.d("playerVolume", String.valueOf(nextPlayerVolume));

            nextPlayer.setVolume(nextPlayerVolume, nextPlayerVolume);

            currentPlayer = nextPlayer;

            createNextMediaPlayer();

            Log.d(TAG, String.format("Loop #%d", ++counter));
        }
     }
};

public void setCurrentPlayer(MediaPlayer player)
{
    this.currentPlayer = player;
}

public MediaPlayer getCurrentPlayer()
{
    return this.currentPlayer;
}

public MediaPlayer getNextPlayer()
    {
        return this.nextPlayer;
    }

public void setNextPlayervolume(float volume)
{
    this.nextPlayerVolume = volume;
}

public float getNextPlayerVolume()
{
    return this.nextPlayerVolume;
}

public void releasePlayers()
{
    currentPlayer.release();

    nextPlayer.release();
}
} 
在主活动中,我有一个方法,每当用户播放一个新声音时创建一个LoopMediaPlayer对象,并将其放入loopMediaPlayermap中,我可以控制它(当用户暂停或恢复播放器时):

 public void createplayer(final String resourceName) {

    loopMediaPlayer = LoopMediaPlayer.create(this, resourceName);

    loopMediaPlayerMap.put(resourceName,loopMediaPlayer);
}