Android SoundManager,如何停止声音播放
我使用简单的SoundManager来播放来自sounpool的声音。我的问题是,当我退出应用程序时,声音并没有停止播放,甚至我使用了Android SoundManager,如何停止声音播放,android,audio,soundpool,Android,Audio,Soundpool,我使用简单的SoundManager来播放来自sounpool的声音。我的问题是,当我退出应用程序时,声音并没有停止播放,甚至我使用了mySound.release()。 否则,一切正常,下面是我的代码 import android.content.Context; import android.media.AudioManager; import android.media.SoundPool; public class SoundManager { private Context pCo
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();
}
}
导入android.content.Context;
导入android.media.AudioManager;
导入android.media.SoundPool;
公共类声音管理器{
私人语境;
私人音乐池mySound;
私人浮动利率=1.0f;
专用浮点主音量=1.0f;
私人浮动左音量=1.0f;
私人浮动右音量=1.0f;
私人浮动余额=0.5f;
//构造函数,设置音频管理器并存储应用程序上下文
公共SoundManager(上下文appContext)
{
mySound=新的声音池(16,AudioManager.STREAM_MUSIC,100);
pContext=appContext;
}
//加载声音并返回id
公共整数负载(整数声音\u id)
{
返回mySound.load(pContext,sound_id,1);
}
//播放声音
公共无效播放(int sound_id)
{
播放(声音id,左音量,右音量,1,0,速率);
}
//基于现有余额值设置体积值
公共空间设置体积(浮动体积)
{
主音量=音量;
如果(天平<1.0f)
{
leftVolume=主卷;
rightVolume=主音量*余额;
}
其他的
{
rightVolume=主卷;
leftVolume=主音量*(2.0f-平衡);
}
}
公开无效卸载所有()
{
mySound.release();
}
}
方法play()
返回int StreamId
。您需要将这个StreamId保留在一个变量上,并调用stop方法。例如:
@Override
protected void onPause() {
super.onPause();
mSoundManager.unloadAll();
}
声明流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);
现在,您可以在activities eventsonStop
、onPause
或您想要的位置停止声音流
编辑:
释放SoundPool
资源的最佳方法是调用release
,并在停止播放声音后将引用设置为null。例如:
@Override
protected void onPause() {
super.onPause();
mSoundManager.unloadAll();
}
在SoundManager
上,将unloadAll
方法更改为:
public void unloadAll()
{
mySound.release();
mySound = null;
}
注意以下几点:
onPause–总是在活动即将进入活动状态时调用
背景
释放:释放声音池使用的所有资源
对象空:此声音池对象无法再使用(如@DanXPrado
因此将其设置为null以帮助垃圾收集器将其标识为
可回收的
有关更多详细信息,请参阅
希望这有帮助。方法play()
返回intstreamid
。您需要将这个StreamId保留在一个变量上,并调用stop方法。例如:
@Override
protected void onPause() {
super.onPause();
mSoundManager.unloadAll();
}
声明流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);
现在,您可以在activities eventsonStop
、onPause
或您想要的位置停止声音流
编辑:
释放SoundPool
资源的最佳方法是调用release
,并在停止播放声音后将引用设置为null。例如:
@Override
protected void onPause() {
super.onPause();
mSoundManager.unloadAll();
}
在SoundManager
上,将unloadAll
方法更改为:
public void unloadAll()
{
mySound.release();
mySound = null;
}
注意以下几点:
onPause–总是在活动即将进入活动状态时调用
背景
释放:释放声音池使用的所有资源
对象空:此声音池对象无法再使用(如@DanXPrado
因此将其设置为null以帮助垃圾收集器将其标识为
可回收的
有关更多详细信息,请参阅
希望这有帮助。谢谢!这只是停止声音池还是释放所有内存?如果使用Soundmanager,释放soundpool和所有内存的正确方法是什么?@nemo22898,根据Android文档:它还释放与此流相关的任何本机资源。
。您可以找到stop()
方法的参考。请记住,您的声音池实例将被保留。使用mySound.release()
将您的mySound
引用设置为空。@nemo22898我编辑了我的答案,解释了在SoundManager
类中删除SoundPool
内存资源的最佳方法。如果这回答了你的问题,请接受正确的答案。完美!最后一次编辑成功,谢谢!现在它清除了所有的记忆,就像我希望它做的那样:)谢谢!这只是停止声音池还是释放所有内存?如果使用Soundmanager,释放soundpool和所有内存的正确方法是什么?@nemo22898,根据Android文档:它还释放与此流相关的任何本机资源。
。您可以找到stop()
方法的参考。请记住,您的声音池实例将被保留。使用mySound.release()
将您的mySound
引用设置为空。@nemo22898我编辑了我的答案,解释了在SoundManager
类中删除SoundPool
内存资源的最佳方法。如果这回答了你的问题,请接受正确的答案。完美!最后一次编辑成功,谢谢!现在它可以像我希望的那样清除所有内存:)