Android SoundPool 在播放另一个声音之前不会第二次播放相同的声音
Posted
技术标签:
【中文标题】Android SoundPool 在播放另一个声音之前不会第二次播放相同的声音【英文标题】:Android SoundPool doesn't play same sound for second time until playing another sound 【发布时间】:2017-06-13 02:06:30 【问题描述】:这是我的Activity
:
public class MainActivity extends AppCompatActivity
private SoundPool soundPool;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setVolumeControlStream(AudioManager.STREAM_MUSIC);
soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
final int sound1 = soundPool.load(this, R.raw.whack, 1);
final int sound2 = soundPool.load(this, R.raw.miss, 1);
Button b1 = (Button) findViewById(R.id.b1);
Button b2 = (Button) findViewById(R.id.b2);
b1.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
playSound(sound1);
);
b2.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
playSound(sound2);
);
private void playSound(int soundId)
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
float volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
soundPool.play(soundId, volume, volume, 1, 0, 1);
问题是当我单击 Button1 时,会播放 sound1。然后,当我一次又一次地单击 Button1 时,在单击 Button2 之前什么都不会播放。当我这样做时,会播放 sound2。然后,如果我单击 Button1,则会播放 sound1。当我一遍又一遍地单击 Button2 时,也会发生同样的情况。那么这里有什么问题呢?
【问题讨论】:
在我的 android s6 API 23 中,它可以正常播放。 @Paner,所以您的意思是每次点击每个按钮时都会播放声音?我在 Nexus 5X Android 版本 7.1.1 上运行。我很困惑这是什么问题。 没错,我的声音是:youtube.com/watch?v=PmHyy46J5HE 和 youtube.com/watch?v=DrThE3lLW1k 我也有同样的问题。我的实现在其他版本的操作系统中运行良好,但在我的 Android 7 中我遇到了这个问题。 :( 使用 7.1 (API 25) 遇到同样的问题 【参考方案1】:根据SoundPool.play() 文档volume
值必须从0.0
到1.0
。但是audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
返回更大的值(例如 12)。
因此,您应该设置正确的音量值。下面的工作代码:
public static void playAudio(Context context, SoundPool player, int soundId, float speed)
AudioManager mgr = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
float actualVolume=(float) mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume=(float) mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume= actualVolume/maxVolume;
player.play(soundId, volume, volume, 1, 0, speed);
【讨论】:
它解决了我的问题!谢谢。【参考方案2】:Android 7.0 也有同样的问题,可以尝试修改这部分代码来解决:
float volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
进入
float volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) /
audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
希望这可以解决您面临的问题。 :)
【讨论】:
它不起作用,因为volume
总是0。设置正确的类型:(float)audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)/【参考方案3】:
我们遇到了同样的问题,我们找到了解决这个确切问题的方法。不是最干净的方法,但如果它有效,它并不愚蠢!
它仅适用于最大流数设置为 1。我们在播放正常声音之前以 0 音量播放无声声音。它的优先级也是0。是的,就是这么丑!
这是 Xamarin,所以它是 C# 代码,但 Java 会非常相似。
我们的 Audioservice 的初始化:
_soundPool = new SoundPool.Builder().SetMaxStreams(1).Build();
_silentSoundId = _soundPool.Load(Application.Context, Resource.Raw.Silent, 0);
_soundId = _soundPool.Load(Application.Context, Resource.Raw.Sound, 1);
在播放声音时:
_soundPool.Play(_silentSoundId, 0, 0, 0, 0, 1f);
_soundPool.Play(_soundId, 15, 15, 1, 0, 1f);
【讨论】:
以上是关于Android SoundPool 在播放另一个声音之前不会第二次播放相同的声音的主要内容,如果未能解决你的问题,请参考以下文章