11

这是我的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 时,也会发生同样的情况。那么这里的问题是什么?

4

3 回答 3

9

根据SoundPool.play()文档volume值必须是 from 0.0to 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);
    }
于 2017-11-05T16:36:22.907 回答
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);
于 2018-04-19T13:18:26.507 回答
3

Android 7.0 版本也有同样的问题,您可以尝试通过更改这部分代码来修复它:

float volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

进入

float volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC) /
               audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

希望这可以解决您面临的问题。:)

于 2017-03-29T02:42:04.603 回答