Android soundpool 循环逻辑
Posted
技术标签:
【中文标题】Android soundpool 循环逻辑【英文标题】:Android soundpool loop logic 【发布时间】:2015-10-21 05:23:56 【问题描述】:我有两个按钮可以循环播放相同优先级的音池文件。因此,如果 1 个按钮正在循环播放,而另一个按钮被按下,则此按钮停止,而另一个按钮开始播放。 到这里为止还好。 现在假设我有每个 2 秒的声音文件,在按下 btn 2 后,btn 1 应该完成文件 1 的声音,即如果刚刚开始和停止,它应该播放 2 秒。如何做到这一点?
目前如果我播放btn2,btn 1会在文件未完成播放的那一刻停止播放并启动文件2。我希望在停止之前完全播放文件1。
请帮忙!
【问题讨论】:
【参考方案1】:我不认为你可以用声音池来实现,因为声音池没有 OnComletionListener 或 isPlaying 方法。
实现这一点的唯一方法是创建一个新线程来侦听队列大小并在媒体播放器不播放时使用新 ID 启动媒体播放器。参考下面的代码
private Queue<Integer> qSoundID;
private MediaPlayer mp;
private void init()
yourButton.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
qSoundID.add(R.raw.yoursoundid);
);
qSoundID = new LinkedList<Integer>();
new Thread(new Runnable()
@Override
public void run()
while (true)
try
Thread.sleep(100);
catch (InterruptedException e)
e.printStackTrace();
if (qSoundID.size() > 0)
if(mp==null||!mp.isPlaying())
mp = MediaPlayer.create(MainActivity.this, qSoundID.poll());
mp.start();
).start();
或者在 MediaPlayer 上设置 OnCompletionListener 将播放下一个声音 id。参考下面的代码
private Queue<Integer> qSoundID;
private MediaPlayer mp;
private void init()
yourButton.setOnClickListener(new OnClickListener()
@Override
public void onClick(View v)
int soundID = R.raw.yoursoundid;
playSound(soundID);
);
qSoundID = new LinkedList<Integer>();
private void playSound(int soundID)
if (mp == null || !mp.isPlaying())
mp = MediaPlayer.create(MainActivity.this, soundID);
mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener()
@Override
public void onCompletion(MediaPlayer mp)
playSound(qSoundID.poll());
);
mp.start();
else
qSoundID.add(soundID);
【讨论】:
好吧,这无济于事,因为我使用声音池的循环属性是有原因的。我有许多平均为 2 秒的声音,我希望仅在当前声音在循环中完成播放(完成其 2 秒)时才优先播放下一个声音。还是谢谢! 在使用媒体播放器时,也可以调用MediaPlayer.setLooping(true); 然后你可以编写你的逻辑在 OnCompletionListener 上播放下一个声音,希望这会有所帮助以上是关于Android soundpool 循环逻辑的主要内容,如果未能解决你的问题,请参考以下文章
Android,Soundpool 类 - 循环声音时出现自动暂停问题
Android SoundPool:AudioFlinger 错误
Android:如何混合 2 个音频文件并使用 soundPool 重现它们