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

単一の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 に答える
2

オブジェクト メンバー変数を使用して、現在再生中のサウンドを保持し、呼び出すことができるようstop()にし、null チェックを忘れないようにします。アクティビティを終了しrelease()たら、オブジェクトを忘れないでください。MediaPlayer

以下はおそらくより良い設計です: すべてのオーディオ ファイルをアセット ディレクトリに移動し、ファイル名をボタンのタグに配置し、同じクリック イベント ハンドラーを使用して 1 つの MediaPlayer オブジェクトの状態を取得し、現在再生中の場合は停止します。ボタンのタグから新しいファイルを再生するように設定し、ファイルを再生します。これにより、重複するコードが大幅に削減されます。

于 2012-07-30T23:41:44.793 に答える