web-dev-qa-db-ja.com

メディアプレーヤースタートストップスタート

新しいAndroidサウンドアプリケーションを作成しています。クリックするとサウンドを再生するクリック可能なボタンを作成しましたが、2回目にクリックするとサウンドの再生を停止したいのです。一部は正常に動作するようになりました。ボタンをもう一度クリックしてサウンドを再生すると、再生されません。メディアプレーヤーが完全に停止します。フォーラムを探していましたが、答えが見つからないようです。これが私の活動です:

  MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prvi);

    final MediaPlayer mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
    final MediaPlayer mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);


    Button dugme = (Button) findViewById(R.id.dugme);
    dugme.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (mpButtonClick1.isPlaying()) {
                mpButtonClick1.stop();
                mpButtonClick1.reset();

            }
            else {              
                mpButtonClick1.start();

            }


        }   

    });

MpButtonClick1.prepare();を書き込もうとするとエラーが発生する未処理の例外タイプIOE例外

12
Slim C.

以下のコードでクラスを変更します。

reset();を削除します。

すべてのコンポーネントを適切に初期化します。

MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prvi);

     mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
     mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);


    Button dugme = (Button) findViewById(R.id.dugme);
    dugme.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (mpButtonClick1.isPlaying()) {
                mpButtonClick1.stop();
             }
            else {              
                mpButtonClick1.start();
            }
         }   

    });
3

pauseの代わりにstopを使用してみてください。

理由:MediaPlayerを一時停止すると、後で再開できます。ただし、stopを使用する場合、他のほとんどの方法は機能せず、MediaPlayerを再度準備する(または新しい方法を作成する)必要があります。

enter image description here

詳細: ここ および ここ

PS:リソースの使用が終了したら、メモリを解放することを忘れないでください。

10
gian1200

これを試してください: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;
       }
    }
}
8
Shylendra Madda

簡単な解決策は、停止の代わりに一時停止を使用して、曲の先頭にシークすることです。

0

複数回プレイする必要があり、別のプレイを開始するために1つのプレイを停止する必要がある場合(複数のボタンの場合など)、別のプレーヤーを作成し、前のプレーヤーのリソースを解放するようにします。 。使用を停止するには

mediaPlayer.stop(); 

ただし、プレイの場合は、次のようなものを使用して(ログを特定のニーズに適合させて)、プレーヤーを作成/再作成します。

private boolean createMediaPlayer()
{
    if (mediaPlayer!=null)
    {
        if(mediaPlayer.isPlaying())
        {
            mediaPlayer.stop();
            mediaPlayer.reset();
            mediaPlayer.release();
            mediaPlayer=null;
        }

    }
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setVolume(1f, 1f);
    try
    {
        mediaPlayer.setAudioStreamType(Interop.PRIMARY_STREAM);
        mediaPlayer.setDataSource(m_soundFile);
        mediaPlayer.prepare();
        return true;
        // Interop.logDebug(TAG + "-loadAudio: SUCCESS" + m_soundFile);
    } catch (Exception e)
    {
        Interop.logError(TAG + "-LoadAudio for Clic Sound: audioPlayer prepare failed for current file: " + m_soundFile);
        Interop.logError(TAG + "-Exception: " , e);
        return false;
    }
}

そして使用するより

if (createMediaPlayer())
    mediaPlayer.start();

これにより、メディアプレーヤーが使用するリソースが適切に解放されます。

0
Gogu CelMare

ねえ、以下を使用してください

停止用->メディアプレーヤーmp.seekTo(0); mp.pause();

もう一度開始するには、mp.start();を呼び出します。

0
Lalit kumar

MpButtonClick1.stop()の後にmpButtonClick1.reset()を呼び出しています-これを行わないでください:

if (mpButtonClick1.isPlaying()) {
    mpButtonClick1.stop();
    mpButtonClick1.reset(); //<--------- calling reset(), remove this line
}

reset() のドキュメント:

MediaPlayerを初期化されていない状態にリセットします。このメソッドを呼び出した後、データソースを設定し、prepare()を呼び出して、このメソッドを再度初期化する必要があります。

MpButtonClick1.reset()を削除すると、機能するはずです。

MediaPlayerはステートマシンとして機能することに注意してください。つまり、メソッドを間違った順序で呼び出すと、問題が発生します。 MediaPlayerについてお読みください ここ および ここ

0
Melquiades

この質問はかなり古いことは知っていますが、最近Androidを学習しているときに、この時点で行き詰まり、非常に簡単な解決策を見つけて、みんなと共有したいと思います。

メディアを停止またはリセットしようとする代わりに、シークバック開始位置に戻すことができます。

mediaPlayer.seekTo(0);

参考までに、以下にコードを投稿しています。

public class MainActivity extends AppCompatActivity {

    MediaPlayer mp;

    public void play(View view) {
        mp.start();
    }

    public void pause(View view) {
        mp.pause();
    }

    public void stop(View view) {
        // this seeks to the beginning of the file
        mp.seekTo(0);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mp = MediaPlayer.create(this, R.raw.sample_audio);
    }
}
0
av-sharma