我使用简单的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();
}
}
答案 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);
现在,您可以在活动事件onStop
,onPause
或您想要的位置停止声音流。
修改强>
释放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。
希望这有帮助。