如何在android中发布Soundpool

时间:2016-03-04 08:56:57

标签: android soundpool

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

 public void successfulAlert() {
    Logger.d("", "SuccessAlert Start" + Calendar.getInstance().getTimeInMillis());
    final int audioID = mSPool.load(Application.getInstance(), R.raw.scan, 1);
    mSPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {

        @Override
        public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
            Logger.d("", "SuccessAlert Completed " + Calendar.getInstance().getTimeInMillis());
            float volume = (float) mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
            mSPool.play(audioID, volume, volume, 1, 0, 1f);
          ///  cleanupSound();
        }
    });
    Logger.d(TAG, "Possitive Scan Beep ");
}

此代码为成功警报,我尝试清理soundpool发布,声音没有听到。任何人都可以建议我,播放声音后如何释放soundpool。

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

1 个答案:

答案 0 :(得分:1)

该问题有两个方面: 1)为什么我的声音没有播放? 2)如何正确释放SoundPool?

For 1 - SoundPool播放是异步的。你正在做:“播放然后释放”但你需要做“玩然后等待直到游戏完成然后发布”。

For 2 - 由于1,你不应该在游戏完成之前释放SoundPool。不幸的是,无法要求SoundPool在完成播放后进行回调。我已经看到了两个解决方案:

  • 如果你知道播放样本需要多长时间(X毫秒),可以使用release中的postDelayed来安排Handler,以及将来的X毫秒。< / LI>
  • 确定真正重要的是在应用程序完成后释放SoundPool。因此,监视应用程序中的所有出口点,并确保在每个出口点都释放SoundPool。如果有人在您播放声音时关闭了应用程序,您可能会突然减少该效果,但这可能是您的应用程序退出时的正确行为!

注意:要成为一个真正表现良好的Android公民,您的应用程序应该只播放声音,如果它首先获得并继续保持音频焦点。有关详细信息,请访问:https://developer.android.com/guide/topics/media-apps/volume-and-earphones.html