Остановка и воспроизведение Android MediaPlayer
Я создаю приложение Android, содержащее две кнопки, при каждом нажатии на каждую кнопку воспроизводится mp3 файл.
Проблема в том, что когда я проигрываю button1
, он играет sound1
, когда я нажимаю button2
, он играет sound2
.
Я проверяю каждую кнопку на другом проигрывателе, если он работает, и я останавливаю его и воспроизвожу щелкнутый.
Но если я дважды нажму на одну и ту же кнопку, сначала заставлю сначала воспроизвести звук в фоновом режиме и снова сыграть еще раз.
Я попытался проверить 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();
}
});
}
}
Надеюсь, если есть лучший код, который может использовать несколько кнопок в качестве массива или что-то, что бы не проверять каждую кнопку и игрока каждый раз.
Ответы
Ответ 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;
}
}
}
Ответ 2
В соответствии с жизненным циклом Media Player, который вы можете просмотреть в руководстве Android API, я думаю, что вам нужно позвонить reset ( ) вместо stop(), и после этого снова подготовьте медиаплеер (используйте только один), чтобы воспроизвести звук с самого начала. Учтите также, что звук может быть закончен, поэтому я также рекомендую реализовать setOnCompletionListener(), чтобы убедиться, что если вы попытаетесь воспроизвести звук, это не сработает.
Ответ 3
Чтобы остановить Media Player без риска исключения из-за незаконного состояния, вы должны сделать
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();
}
Ответ 4
на всякий случай кто-то приходит к этому вопросу, у меня есть более легкая версия.
public static MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button b = (Button) findViewById(R.id.button);
Button b2 = (Button) findViewById(R.id.button2);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mp = MediaPlayer.create(MainActivity.this, R.raw.game);
mp.start();
}
});
b2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mp.stop();
// mp.start();
}
});
}