SoundManager,如何停止声音播放

时间:2015-08-12 16:54:45

标签: android audio soundpool

我使用简单的SoundManager来播放来自sounpool的声音。我的问题是,当我退出应用程序时声音不会停止播放,即使我使用mySound.release();。 否则,一切正常,这是我的代码。

import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;

public class SoundManager {

private Context pContext;
private SoundPool mySound;

private float rate = 1.0f;
private float masterVolume = 1.0f;
private float leftVolume = 1.0f;
private float rightVolume = 1.0f;
private float balance = 0.5f;

// Constructor, setup the audio manager and store the app context
public SoundManager(Context appContext)
{
    mySound = new SoundPool(16, AudioManager.STREAM_MUSIC, 100);

  pContext = appContext;
}

// Load up a sound and return the id
public int load(int sound_id)
{
    return mySound.load(pContext, sound_id, 1);

}


// Play a sound
public void play(int sound_id)
{
    mySound.play(sound_id, leftVolume, rightVolume, 1, 0, rate);    
}   

// Set volume values based on existing balance value
public void setVolume(float vol)
{
    masterVolume = vol;

    if(balance < 1.0f)
    {
        leftVolume = masterVolume;
        rightVolume = masterVolume * balance;
    }
    else
    {
        rightVolume = masterVolume;
        leftVolume = masterVolume * ( 2.0f - balance );
    }

}


public void unloadAll()
{
    mySound.release();      
}

}

1 个答案:

答案 0 :(得分:0)

方法play()返回int StreamId。您需要将此StreamId保留在变量上并调用stop方法。例如:

声明Stream Id变量:

private int mStreamId;

然后,在开始新声音流时保留它:

// Play a sound
public void play(int sound_id)
{
    mStreamId = mySound.play(sound_id, leftVolume, rightVolume, 1, 0, rate);    
}   

所以你可以阻止它:

mySound.stop(mStreamId);

现在,您可以在活动事件onStoponPause或您想要的位置停止声音流。

修改

释放SoundPool资源的最佳方式是调用release并在停止播放声音后将引用设置为null 。例如:

@Override
protected void onPause() {
    super.onPause();
    mSoundManager.unloadAll();
}

SoundManager上,将unloadAll方法更改为:

public void unloadAll()
{
    mySound.release();
    mySound = null;    
}
  

请注意以下事项:

     

onPause - 在活动即将进入时始终会调用   背景

     

发布:会释放SoundPool使用的所有资源

     

object null:此SoundPool对象无法再使用(如@DanXPrado   说)所以将其设置为null以帮助垃圾收集器将其识别为   可回收。

有关详细信息,请参阅this tutorial about SoundPool

希望这有帮助。