0

如何修改它,以便如果一个声音已经在播放并且单击另一个声音,则前一个声音停止播放而新选择的声音开始?提前感谢大家的帮助。(这不是最重要的所有代码)

public class newBoard extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.main);

    Toast.makeText(this, "Thank you for using this App.", Toast.LENGTH_LONG).show();

    // ads - load request to display
    AdView layout = (AdView)this.findViewById(R.id.adView);

    // ads - load display with an ad
    AdRequest adRequest = new AdRequest();
    adRequest.setTesting(true);

    layout.loadAd(adRequest);

    // import sound files
    final MediaPlayer sound01 = MediaPlayer.create(this, R.raw.sound01);
    final MediaPlayer sound02 = MediaPlayer.create(this, R.raw.sound02);
    final MediaPlayer sound03 = MediaPlayer.create(this, R.raw.sound03);
    final MediaPlayer sound04 = MediaPlayer.create(this, R.raw.sound04);
    final MediaPlayer sound05 = MediaPlayer.create(this, R.raw.sound05);
    final MediaPlayer sound06 = MediaPlayer.create(this, R.raw.sound06);
    final MediaPlayer sound07 = MediaPlayer.create(this, R.raw.sound07);
    final MediaPlayer sound08 = MediaPlayer.create(this, R.raw.sound08);
    final MediaPlayer sound09 = MediaPlayer.create(this, R.raw.sound09);
    final MediaPlayer sound10 = MediaPlayer.create(this, R.raw.sound10);
    final MediaPlayer sound11 = MediaPlayer.create(this, R.raw.sound11);
    final MediaPlayer sound12 = MediaPlayer.create(this, R.raw.sound12);
    final MediaPlayer sound13 = MediaPlayer.create(this, R.raw.sound13);
    final MediaPlayer sound14 = MediaPlayer.create(this, R.raw.sound14);
    final MediaPlayer sound15 = MediaPlayer.create(this, R.raw.sound15);
    final MediaPlayer sound16 = MediaPlayer.create(this, R.raw.sound16);
    final MediaPlayer sound17 = MediaPlayer.create(this, R.raw.sound17);
    final MediaPlayer sound18 = MediaPlayer.create(this, R.raw.sound18);
    final MediaPlayer sound19 = MediaPlayer.create(this, R.raw.sound19);
    final MediaPlayer sound20 = MediaPlayer.create(this, R.raw.sound20);
    final MediaPlayer sound21 = MediaPlayer.create(this, R.raw.sound21);
    final MediaPlayer sound22 = MediaPlayer.create(this, R.raw.sound22);
    final MediaPlayer sound23 = MediaPlayer.create(this, R.raw.sound23);
    final MediaPlayer sound24 = MediaPlayer.create(this, R.raw.sound24);
    final MediaPlayer sound25 = MediaPlayer.create(this, R.raw.sound25);

    // play sound files on clicks
    Button s01 = (Button) findViewById(R.id.button01); 
    s01.setText(this.getString(R.string.quote01));
    s01.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            try {
                sound01.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            sound01.start();                
            }

    });
    registerForContextMenu(s01);

    Button s02 = (Button) findViewById(R.id.button02); 
    s02.setText(this.getString(R.string.quote02));
    s02.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            try {
                sound02.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            sound02.start();
        }
    });
    registerForContextMenu(s02);

    Button s03 = (Button) findViewById(R.id.button03); 
    s03.setText(this.getString(R.string.quote03));
    s03.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            try {
                sound03.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            sound03.start();
        }
    });
    registerForContextMenu(s03);

    Button s04 = (Button) findViewById(R.id.button04); 
    s04.setText(this.getString(R.string.quote04));
    s04.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            try {
                sound04.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            sound04.start();
        }
    });
    registerForContextMenu(s04);

    Button s05 = (Button) findViewById(R.id.button05); 
    s05.setText(this.getString(R.string.quote05));
    s05.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            try {
                sound05.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            sound05.start();
        }
    });
    registerForContextMenu(s05);

    Button s06 = (Button) findViewById(R.id.button06); 
    s06.setText(this.getString(R.string.quote06));
    s06.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            try {
                sound06.prepare();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            sound06.start();
        }
    });
    registerForContextMenu(s06);
4

2 回答 2

2

Use a object member variable to hold on to your currently playing sound so that you can call stop() and don't forget to null check it. Don't forget to release() your MediaPlayer object once you leave your activity.

The following is probably a better design: move all your audio files to your assets directory and put the file name in the button's tag, use the same click event handler to get the state of the one MediaPlayer object, stop it if its currently playing, set the new file to play from the button's tag and play the file. This will reduce your duplicate code significantly.

于 2012-07-30T23:41:44.793 回答
2

使用单个MediaPlayer实例。您的设备在大多数设备上都会失败,因为无论如何分配给MediaPlayer. 此外,重复的代码也很糟糕。坏坏:

public class NewBoard extends Activity {
    private MediaPlayer player;
    private Resources res;

    private int buttonIds = { R.id.button01, R.id.button02, R.id.button03,
                              R.id.button04, R.id.button05, R.id.button06,
                              R.id.button07, R.id.button08, R.id.button09,
                              R.id.button10, R.id.button11, R.id.button12,
                              R.id.button13, R.id.button14, R.id.button15,
                              R.id.button16, R.id.button16, R.id.button17,
                              R.id.button18, R.id.button19, R.id.button20,
                              R.id.button21, R.id.button22, R.id.button23,
                              R.id.button24, R.id.button25 };

    private int soundIds =  { R.raw.sound01, R.raw.sound02, R.raw.sound03,
                              R.raw.sound04, R.raw.sound05, R.raw.sound06,
                              R.raw.sound07, R.raw.sound08, R.raw.sound09,
                              R.raw.sound10, R.raw.sound11, R.raw.sound12,
                              R.raw.sound13, R.raw.sound14, R.raw.sound15,
                              R.raw.sound16, R.raw.sound16, R.raw.sound17,
                              R.raw.sound18, R.raw.sound19, R.raw.sound20,
                              R.raw.sound21, R.raw.sound22, R.raw.sound23,
                              R.raw.sound24, R.raw.sound25 };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);

        //Kill this with fire -- just an unnecessary user annoyance.
        Toast.makeText(this, 
            "Thank you for using this App.", Toast.LENGTH_LONG).show();

        AdView layout = (AdView)findViewById(R.id.adView);
        AdRequest adRequest = new AdRequest();
        adRequest.setTesting(true);
        layout.loadAd(adRequest);

        player = new MediaPlayer();
        res = getResources();

        for(int i = 0, n = buttonIds.length(); i < n; i++) {
            Button button = (Button)findViewById(buttonIds[i]);
            button.setOnClickListener(new SoundClickListener(soundIds[i]));
        }
    }

    private class SoundClickListener implements OnClickListener {
        private int id;

        public SoundClickListener(int soundId) {
            id = soundId;
        }

        public void onClick(View v) {
            player.reset();
            player.setDataSource(
                res.openRawResourceFd(id).getFileDescriptor());
            player.prepare();
            player.start();
        }
    }
}

像这样的东西。可能会也可能不会按原样编译。此外,正如评论的那样,Toast用火杀死 - 这很烦人。

于 2012-07-31T00:13:33.390 回答