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