如何在没有 API 8 中引入的 onLoadCompleteListener 的情况下检查 SoundPool 是不是准备好播放?
Posted
技术标签:
【中文标题】如何在没有 API 8 中引入的 onLoadCompleteListener 的情况下检查 SoundPool 是不是准备好播放?【英文标题】:How to check if SoundPool is ready to play without onLoadCompleteListener which was introduced in API 8?如何在没有 API 8 中引入的 onLoadCompleteListener 的情况下检查 SoundPool 是否准备好播放? 【发布时间】:2015-01-08 17:07:19 【问题描述】:android 程序如何检查 Sound 是否已准备好并在旧版本的 Android 中播放?通常人们会这样告诉Soundpool:
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener()
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status)
loaded = true;
);
soundID = soundPool.load(this, R.raw.beep, 1);
但是 onLoadCompleteListener 是在 API 级别 8 中引入的,因此它不起作用。我的程序无法播放任何声音。检查声音是否可以播放的替代方法是什么?我只是想在背景中放一些音乐。
【问题讨论】:
我要问一个显而易见的问题——为什么你需要支持比版本 8 更早的版本? Play 商店中只有不到 0.4% 的 Android 设备是版本 8。低于该版本的所有版本均不大于 0.1%。大多数开发人员部署 10 个(占 7.8%)甚至更高。针对 8 之前的设备,您将做大量工作而收获甚微。 不幸的是,我碰巧拥有一个:/ 作为一名学生,我太穷了,无法用 150 欧元购买一部新手机。我需要测试一下。 我认为load()
在 API 8 之前是同步的。
【参考方案1】:
现在这可能是一个有争议的问题,但在 API 8 之前,我会通过尝试以 0.0 音量播放来检查声音是否准备就绪,并查看它是否返回了一个正数的流 ID。如果不是,我会在“准备”阶段睡觉并循环播放,直到它播放为止。
// Briefly play the stream at zero volume to get it decoded and prepped.
int stream = soundPool.play( soundPoolId, 0.0f, 0.0f, 1, 0, 1.0f );
if (stream > 0)
soundPool.stop(stream);
isPrepared = true;
【讨论】:
以上是关于如何在没有 API 8 中引入的 onLoadCompleteListener 的情况下检查 SoundPool 是不是准备好播放?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 org.w3c.dom.NodeList 与 Java 8 Stream API 一起使用?