【问题标题】:SoundPool not Playing?SoundPool 没有播放?
【发布时间】:2026-02-04 10:05:02
【问题描述】:

我有 2 个SoundPool 实例,如果我运行我的应用程序,soundPool2 运行与soundPool1 相同的声音,我不知道为什么会播放相同的声音。谁能帮我找出问题所在?

public class MainActivity extends Activity implements OnTouchListener {
private SoundPool soundPool;
private SoundPool soundPool2;
private int soundID;
private int soundID2;
boolean loaded = true;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    View view = findViewById(R.id.button1);
    view.setOnTouchListener(this);

    // Set the hardware buttons to control the music
    this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
    // Load the sound
    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.sound1, 1);

    View view2 = findViewById(R.id.button2);
    view2.setOnTouchListener(this);
    this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
    soundPool2 = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    soundPool2.setOnLoadCompleteListener(new OnLoadCompleteListener()
    {
        @Override
        public void onLoadComplete(SoundPool soundPool2, int sampleId,
                int status) {
            loaded = true;


        }
    });


    soundID2 = soundPool.load(this, R.raw.bird, 1);

}

public boolean onTouch( View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        // Getting the user sound settings
        AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        float actualVolume = (float) audioManager
                .getStreamVolume(AudioManager.STREAM_MUSIC);
        float maxVolume = (float) audioManager
                .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        float volume = actualVolume / maxVolume;
        // Is the sound loaded already?
        if (loaded) {
            soundPool.play(soundID, volume, volume, 1, 0, 1f);
            Log.e("Test", "Played ");
        }
    }
    return false;
}

public boolean onTouch2( View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
    // Getting the user sound settings
    AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
    float actualVolume = (float) audioManager
            .getStreamVolume(AudioManager.STREAM_MUSIC);
    float maxVolume = (float) audioManager
            .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    float volume = actualVolume / maxVolume;
    // Is the sound loaded already?
    if (loaded) {
        soundPool2.play(soundID2, volume, volume, 1, 0, 1f);
        Log.e("Test", "Played sound");
    }
}
return false;
}}

【问题讨论】:

    标签: android audio soundpool


    【解决方案1】:

    首先,您只需要一个 SoundPool 实例,而不是两个。

    另外,你的onTouchonTouch2 对我来说没有多大意义,那里也可能有问题,所以我也重写了那部分。

    请尝试以下代码。

    public class MainActivity extends Activity implements OnTouchListener {
        private SoundPool mSoundPool;
        private int mSoundID;
        private int mSoundID2;
        private boolean mSoundLoaded = false;
        private float mVolume = 0f;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);
    
            View view = findViewById(R.id.button1);
            view.setOnTouchListener(this);
            View view2 = findViewById(R.id.button2);
            view2.setOnTouchListener(this);
    
            // Set the hardware buttons to control the music
            this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
    
            // Load the sound
            mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
            mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                @Override
                public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                    if (sampleId == R.raw.bird) {
                        mSoundLoaded = true;
                    }
                }
            });
    
            mSoundID = mSoundPool.load(this, R.raw.sound1, 1);
            mSoundID2 = mSoundPool.load(this, R.raw.bird, 1);
    
            // Getting the user sound settings
            AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
            float actualVolume = (float) audioManager
                    .getStreamVolume(AudioManager.STREAM_MUSIC);
            float maxVolume = (float) audioManager
                    .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
            mVolume = actualVolume / maxVolume;
        }
    
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                // Is the sound loaded already?
                if (mSoundLoaded) {
                    if (v.getId() == R.id.button1) {
                        playSound(mSoundID);
                        Log.e("Test", "Played mSoundID");
                    } else if (v.getId() == R.id.button2) {
                        playSound(mSoundID2);
                        Log.e("Test", "Played mSoundID2");
                    }
                }
            }
            return false;
        }
    
        private void playSound(int soundId) {
            mSoundPool.play(soundId, mVolume, mVolume, 1, 0, 1f);
        }
    }
    

    注意:可能有错误,是未经测试的代码。

    【讨论】:

    • 非常感谢老师,它的作品,我测试过,完美!!! :) ,然后运行 ​​find .. 再次感谢,我是新手,我必须学习更多。呵呵@Tigger
    • 很高兴能提供帮助。
    • @Tigger 嘿触发器我需要你的声音池帮助。这是一个简单的代码,请邀请我到聊天室。谢谢!
    最近更新 更多