当我使用条形码扫描机架时,我实现了一个单例类的 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;
}
}
问题有两个方面: 1) 为什么我的声音没有播放? 2)如何正确释放SoundPool?
对于 1 - SoundPool 播放是异步的。您正在执行:“播放然后发布”,但您需要执行“播放然后等待播放完成然后发布”。
对于 2 - 由于 1,您不应该在播放完成之前释放 SoundPool。不幸的是,“没有办法”让 SoundPool 在播放完毕后进行回调。我见过两种解决方案:
如果您知道播放示例需要多长时间(X 毫秒),请将您的release
postDelayed
中的 Handler
。确定真正重要的问题是在应用程序完成时释放 SoundPool。因此,监视应用程序的所有出口点,并确保在每个出口点释放 SoundPool。如果有人在您播放声音时关闭应用程序,您可能会突然切断该效果,但这可能是您的应用程序退出时的正确行为!