如何在没有 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 一起使用?

JAVA8 日期时间API整理

ArcGIS JavaScript API4.8 底图选择的几种方案

Angular 8:如何在没有刷新令牌的情况下刷新令牌

Android 8.0 功能和 API

java1.8新特性