如何在android中发布Soundpool

问题描述 投票:0回答:1

当我使用条形码扫描机架时,我实现了一个单例类的 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 版本,但听不到声音。谁能建议我,如何在播放声音后释放声音池。

 public void cleanupSound() {
    if (mSPool != null) {
        mSPool.release();
       // mSPool=null;
       // mAudioManager.unloadSoundEffects();
       // mInstance=null;
    }
}
android soundpool
1个回答
1
投票

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

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

对于 2 - 由于 1,您不应该在播放完成之前释放 SoundPool。不幸的是,“没有办法”让 SoundPool 在播放完毕后进行回调。我见过两种解决方案:

如果您知道播放示例需要多长时间(X 毫秒),请将您的
    release
  • 安排在未来 X 毫秒,也许使用
    postDelayed
    中的
    Handler
    确定真正重要的问题是在应用程序完成时释放 SoundPool。因此,监视应用程序的所有出口点,并确保在每个出口点释放 SoundPool。如果有人在您播放声音时关闭应用程序,您可能会突然切断该效果,但这可能是您的应用程序退出时的正确行为!
  • 注意:要成为真正行为良好的 Android 公民,您的应用程序应该仅在首次获取并继续保持音频焦点时播放声音。有关更多信息,请访问:
https://developer.android.com/guide/topics/media-apps/volume-and-earphones.html

© www.soinside.com 2019 - 2024. All rights reserved.