Android MediaPlayer setNextMediaPlayer()替代

我最近发布了一个应用程序,用户报告崩溃,因为我的程序包含了setNextMediaPlayer()方法。 我现在意识到, 这只适用于API 16 +,我的应用程序支持API 8 + 。 我想知道是否有另一种方法达到同样的效果。

我的应用程序有一些文本到语音,我正在做的是创buildMediaPlayers ArrayList ,每个有一个短的声音文件,然后一个接一个地播放它们。 如果我从代码中删除这个方法,那么audio变得太不明了。

我正在考虑使用SoundPool类,但没有OnCompleteListener ,所以我不知道该怎么做。

所以基本上我的问题是: 是否有一种方法可以在不使用setNextMediaPlayer()方法的情况下在audio文件之间进行无缝转换?

非常感谢你花时间陪伴!

编辑

我添加了这个代码,我发现

  private class CompatMediaPlayer extends MediaPlayer implements OnCompletionListener { private boolean mCompatMode = true; private MediaPlayer mNextPlayer; private OnCompletionListener mCompletion; public CompatMediaPlayer() { try { MediaPlayer.class.getMethod("setNextMediaPlayer", MediaPlayer.class); mCompatMode = false; } catch (NoSuchMethodException e) { mCompatMode = true; super.setOnCompletionListener(this); } } public void setNextMediaPlayer(MediaPlayer next) { if (mCompatMode) { mNextPlayer = next; } else { super.setNextMediaPlayer(next); } } @Override public void setOnCompletionListener(OnCompletionListener listener) { if (mCompatMode) { mCompletion = listener; } else { super.setOnCompletionListener(listener); } } @Override public void onCompletion(MediaPlayer mp) { if (mNextPlayer != null) { // as it turns out, starting a new MediaPlayer on the completion // of a previous player ends up slightly overlapping the two // playbacks, so slightly delaying the start of the next player // gives a better user experience SystemClock.sleep(50); mNextPlayer.start(); } mCompletion.onCompletion(this); } } 

但现在如何添加audio文件? 我试过这个:

  // assigns a file to each media player mediaplayers = new ArrayList<CompatMediaPlayer>(); for (int i = 0; i < files.size(); i++) { mediaplayers.add((CompatMediaPlayer) CompatMediaPlayer.create(this, files.get(i))); } 

但是因为MediaPlayer不能被播放到CompatMediaPlayer,我得到了一个类转换exception。

Solutions Collecting From Web of "Android MediaPlayer setNextMediaPlayer()替代"

创build与onCompletionListener一起工作的Compat播放器来启动下一个播放器,如:

 public void onCompletion(MediaPlayer mp) { if (mCompatMode && mNextPlayer != null) { mNextPlayer.prepare(); mNextPlayer.start(); } } 

在你的构造函数的某个地方检查是否有方法(或检查SDK版本)名为"setNextMediaPlayer"

mCompatMode = Build.VERSION.SDK_INT < 16;

定义这样的方法:

 public void setNextMediaPlayer(MediaPlayer next) { if (mCompatMode) { mNextPlayer = next; } else { super.setNextMediaPlayer(next); } }