【问题标题】:Android SoundPool: Play a stopped sound againAndroid SoundPool:再次播放停止的声音
【发布时间】:2015-12-07 23:22:19
【问题描述】:

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

加载声音:

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() 调用开始播放声音。

这是一个错误吗?还是我用错了?

【问题讨论】:

    标签: android soundpool


    【解决方案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 也有同样的问题?
    • 我已经检查了我的代码两次,它在 AudioManager.STREAM_MUSIC 和 AudioManager.STREAM_RING 上都能正常工作。我建议您创建一个示例项目并测试您想要的所有可能性,或者在您当前的项目中提供 soundPool 的确切实现。
    【解决方案2】:

    播放:

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

    现在重新加载它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多