Android SoundManager,如何停止声音播放

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

我使用简单的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();      
}

}
导入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 events
onStop
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 events
onStop
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
内存资源的最佳方法。如果这回答了你的问题,请接受正确的答案。完美!最后一次编辑成功,谢谢!现在它可以像我希望的那样清除所有内存:)