Android SoundPool:再次播放已停止的声音

3

我目前正在尝试使用SoundPool API在我的Android应用程序中播放声音。播放声音不是问题。现在我想停止声音,稍后从头开始重新启动。但是当我调用stop函数然后play()时,声音不会播放。这里是一些代码:

加载声音:

soundId = soundPool.load(context, fileId, 1);

播放声音:

streamId = soundPool.play(soundId, 1.0f, 1.0f, 1, -1, 1);

停止声音:

soundPool.stop(streamId);

我也尝试在第二次播放之前重新加载声音,但这并没有解决问题。
当我使用暂停/恢复时,声音会从停止的位置开始播放(但是我总是希望它从开头开始)。
任何帮助将不胜感激。
编辑:
我刚刚发现一些奇怪的事情。当我使用soundpool.stop()时,每隔一次调用soundpool.play()就会有效。因此,第一次调用play()播放声音,第二次不播放,第3次、第5次、第7次...调用都会播放声音。当我使用soundpool.pause()然后play()时,每隔三次才有效。因此,第1次、第4次、第7次...调用play()将开始播放声音。
这是一个错误吗?还是我使用方法不正确?
2个回答

1
我创建了一个简单的项目,可以启动和停止声音,然后再次播放它。以下是代码:
Button b1, b2;
private int streamId;
private int soundID;
private SoundPool sp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    b1 = (Button) findViewById(R.id.b1);
    b2 = (Button) findViewById(R.id.b2);
    sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
    soundID = sp.load(this, R.raw.middle, 1);
    b1.setOnClickListener(this);
    b2.setOnClickListener(this);

}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub

    switch (v.getId()) {
    case R.id.b1:
        streamId = sp.play(soundID, 1, 1, 1, 0, 1f);
        break;
    case R.id.b2:
        sp.stop(streamId);

        break;
    }
}

在我的情况下,我成功地完成了工作。如果您也在做同样的事情,那么问题可能出现在其他地方。如果您能提供更多的细节,那么我们或许可以找出问题所在。


谢谢您的回复。使用您的代码时,我听不到任何声音。当我在SoundPool对象的初始化中将“AudioManager.STREAM_MUSIC”更改为“AudioManager.STREAM_RING”(就像我在我的应用程序中使用的那样)时,每隔一秒钟我才能听到声音。我需要为STREAM_MUSIC获取额外的权限吗?并且,您能否测试一下是否使用STREAM_RING会遇到同样的问题? - user3266343
我已经检查了我的代码两次,对于AudioManager.STREAM_MUSIC和AudioManager.STREAM_RING都可以正常工作。我建议您创建一个示例项目并测试您想要的所有可能性,或者提供当前项目中soundPool的确切实现。 - Ravinder Bhandari

0

播放:

nowPlaying= soundPool.play(soundId, 1.0f, 1.0f, 1, -1, 1); 

soundPool.stop(nowPlaying);

现在重新加载它:

soundId = soundPool.load(this, R.raw.yoursound, 0);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接