如何在android中发布Soundpool

如何在android中发布Soundpool,android,soundpool,Android,Soundpool,当我使用条形码扫描机架时,我实现了一个单一的soundpool类,当继续扫描时,应用程序自动关闭。错误是“无法从地块读取输入通道文件描述符” 此代码为成功警报,我尝试清理声音池释放,声音未被听到。有谁能建议我,在播放声音后如何释放soundpool public void cleanupSound() { if (mSPool != null) { mSPool.release(); // mSPool=null; // mAudioMana

当我使用条形码扫描机架时,我实现了一个单一的soundpool类,当继续扫描时,应用程序自动关闭。错误是“无法从地块读取输入通道文件描述符”

此代码为成功警报,我尝试清理声音池释放,声音未被听到。有谁能建议我,在播放声音后如何释放soundpool

 public void cleanupSound() {
    if (mSPool != null) {
        mSPool.release();
       // mSPool=null;
       // mAudioManager.unloadSoundEffects();
       // mInstance=null;
    }
}
问题有两个方面: 1) 为什么我的声音没有播放? 2) 如何正确释放声音池

对于1-声音池播放是异步的。您正在执行:“播放然后释放”,但您需要执行“播放然后等待播放完成,然后释放”

对于2-由于1,您不应该释放一个声音池,直到播放完成。不幸的是,没有办法要求声音池在播放结束后回调。我看到了两种解决方案:

  • 如果您知道播放示例(X ms)需要多长时间,那么可以使用
    处理程序中的
    postDelayed
    为您的
    版本安排X ms的播放时间
  • 确定真正重要的问题是在应用程序完成时发布声音池。因此,监视应用程序中的所有退出点,并确保每次都释放声音池。如果有人在您播放声音时关闭应用程序,您可能会突然切断该效果,但这可能是应用程序退出时的正确行为
注意:要成为一个真正表现良好的Android公民,您的应用程序应该只在首次获得并继续保持音频焦点的情况下播放声音。更多信息请点击此处:

 public void cleanupSound() {
    if (mSPool != null) {
        mSPool.release();
       // mSPool=null;
       // mAudioManager.unloadSoundEffects();
       // mInstance=null;
    }
}