32

私は 2 つのボタンを含む Android アプリケーションを作成しています。各ボタンをクリックすると、mp3 ファイルが再生されます。問題は、再生するbutton1と再生されsound1、クリックbutton2すると再生されますsound2

他のプレーヤーの各ボタンが機能しているかどうかを確認し、停止してクリックしたボタンを再生します

しかし、同じボタンを2回クリックすると、最初のオーディオをバックグラウンドで再生し続け、別のオーディオをもう一度再生します

確認isPlaying()して停止しようとしましたが、うまくいきません!

クリックするbutton1と再生sound1し、もう一度クリックすると停止して最初から再生します。

私のコード:

package com.hamoosh.playaudio;
import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class PlayaudioActivity extends Activity {
/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button b= (Button) findViewById(R.id.button1);
        Button b2= (Button) findViewById(R.id.button2);
        final TextView t= (TextView) findViewById(R.id.textView1);

        final MediaPlayer mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far);
        final MediaPlayer mp1 = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet);

        b.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mp1.isPlaying()) {

                    mp1.stop();
                }

                mp.start();
            }

        });

        b2.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mp.isPlaying()) {

                    mp.stop();
                }
                mp1.start();
            }
        });
    }
}

複数のボタンを配列または何かとして使用して、各ボタンとプレーヤーを毎回チェックしないようにするより良いコードがあるかどうかを願っています。

4

5 に答える 5

64

mediaplayer オブジェクトを 1 つだけ使用する必要があります

    public class PlayaudioActivity extends Activity {

        private MediaPlayer mp;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button b = (Button) findViewById(R.id.button1);
            Button b2 = (Button) findViewById(R.id.button2);
            final TextView t = (TextView) findViewById(R.id.textView1);

            b.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    stopPlaying();
                    mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far);
                    mp.start();
                }

            });

            b2.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    stopPlaying();
                    mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet);
                    mp.start();
                }
            });
        }

        private void stopPlaying() {
            if (mp != null) {
                mp.stop();
                mp.release();
                mp = null;
           }
        }
    }
于 2012-09-04T15:25:46.623 に答える
9

Illegal State Exception のリスクなしにメディア プレーヤーを停止するには、次のことを行う必要があります。

  try {
        mp.reset();
        mp.prepare();
        mp.stop();
        mp.release();
        mp=null;
       }
  catch (Exception e)
         {
           e.printStackTrace();
         }

だけではなく

try {
       mp.stop();
       mp.release();
       mp=null;
    } 
catch (Exception e) 
    {
      e.printStackTrace();
    }
于 2016-08-08T22:45:54.640 に答える
5

Android API ガイドMediaPlayerで確認できるライフサイクルによると、 の代わりに呼び出して、最初からサウンドを再生するには、メディア プレーヤー (1 つだけを使用) を再度準備する必要があると思います。音が終わっていることも考慮してください。そのため、もう一度サウンドを再生しようとしても失敗しないように実装することもお勧めします。reset()stop()setOnCompletionListener()

于 2012-09-04T15:26:23.813 に答える
1

あなたの答えが正しくないかもしれませんが、これを試すことができます:

public void MusicController(View view) throws IOException{
    switch (view.getId()){
        case R.id.play: mplayer.start();break;
        case R.id.pause: mplayer.pause(); break;
        case R.id.stop:
            if(mplayer.isPlaying()) {
                mplayer.stop();
                mplayer.prepare(); 
            }
            break;

    }// where mplayer is defined in  onCreate method}

すべてを処理するスレッドは 1 つしかないため、stop() によって終了するため、再度準備する必要があります。開始ボタンを押したときに再度開始することを意図している場合 (IO 例外がスローされます)、または MediaPlayer をよりよく理解するために、次のことができます。Android Media Playerを参照してください

于 2020-03-26T12:10:49.350 に答える