在android soundpool中播放新声音时如何停止所有其他以前的声音?

Posted

技术标签:

【中文标题】在android soundpool中播放新声音时如何停止所有其他以前的声音?【英文标题】:How to Stop all other previous sounds when new sound play in android soundpool? 【发布时间】:2021-09-19 06:23:16 【问题描述】:

我编写了一个简单的代码来构建一个适用于 android 的钢琴应用程序。当我按下相关按钮时它可以播放音符,但是当我按下一个又一个按钮时,两个音符一起播放。我想在按下新按钮时停止预览按钮的声音。我只想一次播放一种声音。我使用了 soundpool.stop(streamID) 但它不起作用。请问谁能解释一下如何解决这个问题?

public class MainActivity extends AppCompatActivity 

private Button a,b,c,d,e,f,g;

private SoundPool soundPool;
private int sound_a,sound_b,sound_c,sound_d,sound_e,sound_f,sound_g,sound_h;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    a = (Button) findViewById(R.id.a);
    b = (Button) findViewById(R.id.b);
    c = (Button) findViewById(R.id.c);
    d = (Button) findViewById(R.id.d);
    e = (Button) findViewById(R.id.e);
    f = (Button) findViewById(R.id.f);
    g = (Button) findViewById(R.id.g);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
        soundPool = new SoundPool.Builder().setMaxStreams(5).build();
    else 
        soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC,0);
    



    sound_a = soundPool.load(this,R.raw.a3,1);
    sound_b = soundPool.load(this,R.raw.b3,1);
    sound_c = soundPool.load(this,R.raw.c3,1);
    sound_d = soundPool.load(this,R.raw.d3,1);
    sound_e = soundPool.load(this,R.raw.e3,1);
    sound_f = soundPool.load(this,R.raw.f3,1);
    sound_g = soundPool.load(this,R.raw.g3,1);

    a.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            soundPool.play(sound_a,1,1,0,0,1);
        
    );

    b.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            soundPool.play(sound_b,1,1,0,0,1);
        
    );


    c.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 

            soundPool.play(sound_c,1,1,0,0,1);
        
    );


    d.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            soundPool.play(sound_d,1,1,0,0,1);
        
    );


    e.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            soundPool.play(sound_e,1,1,0,0,1);
        
    );


    f.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            soundPool.play(sound_f,1,1,0,0,1);
        
    );


    g.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            soundPool.play(sound_g,1,1,0,0,1);
        
    );






【问题讨论】:

【参考方案1】:

我找到了解决方案。我将 maxStream 值更改为 1 并解决了问题。

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
    soundPool = new SoundPool.Builder().setMaxStreams(1).build();
else 
    soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC,0);

【讨论】:

以上是关于在android soundpool中播放新声音时如何停止所有其他以前的声音?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 SoundPool 声音第一次在 Android 上没有播放?

播放大量声音时,Android soundpool 意外关闭应用程序而没有消息

Android 编程 - 如何从广播接收器播放 SoundPool 声音?

Android SoundPool 不播放 wav 格式的声音

如何在特定时间段内使用 SoundPool 同时播放声音

Android 游戏 - SoundPool 没有在 Motorola Droid X2 上播放声音