【问题标题】:Android SoundPool.stop does not seem to workAndroid SoundPool.stop 似乎不起作用
【发布时间】:2011-07-27 18:12:57
【问题描述】:

我创建了一个 MySoundPool 类(我将这个类用作 sigelton,但不认为这是相关的,因为其他一切都有效)。我正在初始化 SoundPool,一个 HashMap,并获取 AudioManager 的上下文。此后,我正在加载两个声音。 MySoundpool 由 MySoundPool.playSound(int index, float rate) 方法使用 playSound 剪辑速率为 0.5 = 2.0 并执行语句

float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, index, 0, rate);

到目前为止一切顺利。一切正常。 不,在前一个声音仍在播放时调用 playSound 会发生,我想在播放新声音之前停止它。在上面的代码 sn -p 之前我试过了

mSoundPool.stop(mSoundPoolMap.get(index));

mSoundPool.autoPause();

没有成功。声音只是继续播放到最后。 任何 cmets 将不胜感激

【问题讨论】:

    标签: android soundpool


    【解决方案1】:

    我假设您在 MySoundPool 类的构造函数中创建了一个新的 SoundPool 对象?

    如果是这样,那么 SoundPool 的构造函数采用的第一个参数是同时允许的流数。比如……

    mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    

    这将允许同时播放 10 种声音,因此只需将 10 更改为 1 即可。

    编辑: stop() 方法将流 id 作为参数,它应该是从 play() 方法返回的数字。您可以尝试设置一个等于 play() 返回的变量,然后在停止声音时使用该变量。

    【讨论】:

    • 什么诡计!不会使 SoundPool.stop() 工作,但它满足我的需要。完美,非常感谢 Kieran 的快速回答!
    • 没问题,是的,这是一种解决方法,但我意识到我并没有真正回答您的问题,而是提供了一种解决方法。看看我上面的编辑,看看如何让 stop 工作我相信这是因为你给 stop() 错误的论点......
    • 确实!不是 mSoundPoolMap.get(index),而是调用 mSoundPool.play(...) 返回的 streamID 再次感谢,你拯救了我的一天
    【解决方案2】:

    使用 soundId 播放声音,但使用 streamId 停止它。这些数字并不总是相同的!

    启动声音时,存储返回的streamId:

    int myStreamId = mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, index, 0, rate);
    

    然后使用该 streamId(不是 soundId)来停止声音:

    mSoundPool.stop(myStreamId);
    

    【讨论】:

    • 如果我能说出我读了多少次文档并理所当然地认为streamIDsoundID 是相同的。这是正确的答案!
    • 你拯救了我的一天。谁能想到,那个方法play()返回另一个streamId,应该进一步使用。
    • 谢谢!这应该被选为正确答案!
    【解决方案3】:

    正如课程文档中所说:

    public final int play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) 自:API 级别 1

    从声音 ID 播放声音。播放由 soundID 指定的声音。这是 load() 函数返回的值。如果成功则返回一个非零的流 ID,如果失败则返回零。 streamID 可用于进一步控制播放。

    返回

    non-zero streamID if successful, zero if failed 
    

    遇到同样的问题,为什么不看F M ! :D

    -谢谢大家!

    【讨论】:

      猜你喜欢
      • 2011-07-27
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 2016-02-01
      相关资源
      最近更新 更多